2011-08-15 37 views
6

Tôi đang xem qua tài liệu Cython và xây dựng từng ứng dụng mẫu. Tôi có một chút khó khăn khi sử dụng thư viện C. Sau khi xây dựng thành công tệp .so và cố gắng nhập tệp đó vào tệp python có tên test.py, lỗi sau được ném.Ý nghĩa của hàm ImportError này khi nhập tệp .so do Cython tạo ra là gì?

$ python3.2 test.py 
Traceback (most recent call last): 
    File "test.py", line 12, in <module> 
    from queue import Queue 
ImportError: dlopen(/Users/jeremy/Development/labs/python/cython_lib_wrapper/queue.so, 2): Symbol not found: _queue_free 
    Referenced from: /Users/jeremy/Development/labs/python/cython_lib_wrapper/queue.so 
    Expected in: flat namespace 
in /Users/jeremy/Development/labs/python/cython_lib_wrapper/queue.so 

Tệp .so nằm ngay bên cạnh tệp test.py. Vì vậy, có vẻ như nó nên được tìm thấy. Điều này đang chạy phiên bản Cython mới nhất, với Python 3.2 trên OSX 10.6.

Mọi thông tin chi tiết?

Chỉnh sửa - thêm xây dựng lệnh và đầu ra

$ python3.2 setup.py build_ext --inplace 
running build_ext 
cythoning queue.pyx to queue.c 
building 'queue' extension 
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -DNDEBUG -g -O3 -isysroot /Developer/SDKs/MacOSX10.6.sdk -arch i386 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -I/Library/Frameworks/Python.framework/Versions/3.2/include/python3.2m -c queue.c -o build/temp.macosx-10.6-intel-3.2/queue.o 
    queue.c: In function ‘__pyx_f_5queue_5Queue_append’: 
    queue.c:627: warning: cast to pointer from integer of different size 
    queue.c: In function ‘__pyx_f_5queue_5Queue_extend’: 
    queue.c:740: warning: cast to pointer from integer of different size 
    queue.c: In function ‘__pyx_f_5queue_5Queue_peek’: 
    queue.c:813: warning: cast from pointer to integer of different size 
    queue.c: In function ‘__pyx_f_5queue_5Queue_pop’: 
    queue.c:965: warning: cast from pointer to integer of different size 
    gcc-4.2 -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -isysroot /Developer/SDKs/MacOSX10.6.sdk -g build/temp.macosx-10.6-intel-3.2/queue.o -o 

Chỉnh sửa 2 - thêm "otool" cmd yêu cầu trong bình luận

queue.so: 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0) 

Sửa 3 - thêm "nm" đầu ra

U ___stack_chk_fail 
U ___stack_chk_guard 
U _queue_free 
U _queue_is_empty 
U _queue_new 
U _queue_peek_head 
U _queue_pop_head 
U _queue_push_tail 
U dyld_stub_binder 

cmd đầu ra grep này:

(undefined) external _queue_free (dynamically looked up) 
+2

Điều này có vẻ giống như sự cố liên kết. Bạn có thể xây dựng lại và bao gồm cả đầu ra xây dựng và lệnh được sử dụng để xây dựng ở đây không? – stderr

+0

@Mike Steder Cảm ơn bạn đã xem xét điều này, tôi đã thêm lệnh xây dựng và đầu ra – JeremyFromEarth

+1

Được rồi, không có nhiều bản sao may mắn vì vậy hãy thử gỡ lỗi thêm một chút. Hãy thử 'nm queue.so' và xem những gì được liệt kê bên cạnh _queue_free. Cũng sử dụng 'otool -L queue.so' và kiểm tra xem DYLD_LIBRARY_PATH (' echo $ DYLD_LIBRARY_PATH'). – stderr

Trả lời

5

EDIT:

Ah, bạn không đề cập đến bạn đã có một sự phụ thuộc vào các mã trong libcalg. Những thứ đó cần được biên dịch và đưa vào khi bạn xây dựng cextension.

Chỉ việc điều chỉnh setup.py:

# setup.py 
# ... 
ext_modules = [Extension("queue", ["queue.pyx", "libcalg/queue.c"])] 
# ... 

Chúng ta có thể lùi lại và xem bạn có thể xây dựng một ví dụ thực sự đơn giản:

Tôi đã thử như sau (3 tác phẩm, myext .pyx, test.py, setup.py) và nó hoạt động tốt. Tất nhiên tôi đang ở trên OS X 10.7 vì vậy nó không chính xác giống như môi trường của bạn. Để loại trừ sự khác biệt có lẽ bạn có thể sao chép chúng và xây dựng chúng như là một kiểm tra sanity.

Nội dung myext.pyx:

# myext.pyx 
def square(x): 
    return x * x 

Nội dung test.py

# test.py 
from myext import square 
print "%d squared is %d"%(4, square(4)) 

Nội dung setup.py:

# setup.py 
from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

ext_modules = [Extension("myext", ["myext.pyx"])] 

setup(
    name = 'Hello world app', 
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = ext_modules 
) 

tôi xây dựng trong thư mục chứa các 3 tệp:

cython_test$ /usr/bin/python setup.py build_ext --inplace 
running build_ext 
cythoning myext.pyx to myext.c 
building 'myext' extension 
creating build 
creating build/temp.macosx-10.7-intel-2.7 
llvm-gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -mno-fused-madd -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -Wshorten-64-to-32 -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -arch i386 -arch x86_64 -pipe -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c myext.c -o build/temp.macosx-10.7-intel-2.7/myext.o 
llvm-gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup -Wl,-F. -arch i386 -arch x86_64 build/temp.macosx-10.7-intel-2.7/myext.o -o /Users/steder/SO/cython_test/myext.so 

cython_test$ python test.py 
4 squared is 16: 

Môi trường của tôi có đầu ra otool tương tự và DYLD_LIBRARY_PATH cũng không được đặt nhưng nm -m hiển thị bình phương như được xác định.

Cụ thể:

00000000000011d0 (__DATA,__data) non-external ___pyx_k__square 
00000000000011e0 (__DATA,__data) non-external ___pyx_mdef_5myext_square 
0000000000001218 (__DATA,__bss) non-external ___pyx_n_s__square 
0000000000000c80 (__TEXT,__text) non-external ___pyx_pf_5myext_square 

Xin vui lòng cho này một shot và xem những gì nó nm -m cho thấy trong môi trường của bạn.

+0

Tôi chỉ cần thiết lập và xây dựng nó và nó hoạt động hoàn hảo. Tôi thấy cùng một đầu ra khi tôi chạy "nm". Điều duy nhất tôi phải thay đổi là bản in vì tôi đang sử dụng Python 3.2 và bạn phải sử dụng parens. – JeremyFromEarth

+1

Thú vị ... Thật đáng tiếc, tôi không chắc chắn điều gì khác biệt với tiện ích xếp hàng của bạn. Bạn có thể chia sẻ mã không? – stderr

+0

Tôi thực sự đánh giá cao sự giúp đỡ của bạn! Các tệp nguồn được đặt ở đây: http://whiplax.com/cython_lib_wrapper.zip – JeremyFromEarth

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