2013-11-15 13 views
5

Tôi đang xây dựng mô-đun python từ tệp C++, sử dụng swig và tôi cũng có bản dựng địa chỉ python 2.7 trong thư mục chính của tôi, trên OSX 10.8. Tôi muốn xây dựng với python địa phương của tôi, nhưng osx có một hệ thống python, và gây ra một số rắc rối. Tôi nhận được lỗi sau đâyÁp dụng liên kết đến thư viện trăn cụ thể trên OSX Lion

>>> import example 
Fatal Python error: PyThreadState_Get: no current thread 
Abort trap: 6 

theo dõi xung quanh, đó là do thực thi python của tôi, nhưng mô-đun liên kết với hệ thống python.

tôi triển khai một ví dụ uống một lân nhỏ, as from tutorial, và sau đó liên kết như sau

gcc -shared -I builddir/include/python2.7/ example.c example_wrap.c \ 
    -o _example.so -L builddir/lib/python2.7/ -lpython2.7 

đủ Chắc chắn, các _example.so giữ ràng buộc chống lại python hệ thống, có lẽ vì khuôn khổ đến đầu tiên trong nghị quyết, mặc dù tôi không chắc chắn nếu điều này là lúc liên kết thời gian hoặc tại thời gian thực hiện.

_example.so: 
    _example.so (compatibility version 0.0.0, current version 0.0.0) 
    /System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.2) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0) 

làm cách nào để buộc nó ràng buộc vào thư viện python của riêng tôi?

Sửa: Tôi quản lý thành công để làm cho nó nhập bằng cách làm một

install_name_tool -change 
     /System/Library/Frameworks/Python.framework/Versions/2.7/Python 
     @executable_path/../lib/libpython2.7.dylib 

nhưng nó cảm thấy như một hack. Tôi không thể để người liên kết tìm thấy thư viện cho tôi và đưa tài liệu tham khảo thích hợp vào nó? Tôi không thể chỉ định tên thư viện (libpython2.7.dylib) và để cho nó giải quyết tại thời gian chạy như nó xảy ra trong Linux?

+1

Vì không có ldconfig equivelent cho dyld (hoặc khả năng thêm hệ thống đường dẫn tùy ý mới cho dyld để 'nhận' thư viện mới - Tôi cá cược điều install_name_tool có lẽ là gần nhất bạn sẽ nhận được một giải pháp mà không Không liên quan (1) cài đặt vào đường dẫn thư viện hệ thống (/ lib,/usr/lib) hoặc DYLD_ * biến môi trường. Một giải pháp khác là liên kết đến một lib Python tĩnh (.a) – synthesizerpatel

+0

gần đây có cùng một vấn đề với một đơn giản mở rộng cython trong virtualenv, nó được sử dụng để làm việc trước (osx 10.7), không chắc chắn những gì thay đổi, do đó muốn biết câu trả lời có thẩm quyền PS Tôi đã nhìn thấy một giải pháp hack, nơi mục tiêu '.dylib' được đổi tên chỉ để phiên bản bên phải có thể được liên kết với ... –

+0

Tôi sẽ đề nghị thử bên trong virtualenv, nhưng điều thú vị là @qarma đang gặp vấn đề tương tự ở đó. – cm2

Trả lời

1

Bạn sẽ cần phải kiểm tra các giải pháp, bởi vì tôi không có máy OSX tan để kiểm tra nó ở đây, nhưng tôi nghĩ rằng điều này có thể giải quyết vấn đề của bạn:

Tạo một (hoặc chỉnh sửa) chạy kịch bản và sự thay đổi bí danh hoặc biến PATH của bạn:

alias python='/your/local/python' 
PATH=/your/local/python:$PATH 

# Run your app here 

Hãy cho tôi biết nếu điều này có ích.

Các vấn đề liên quan