2011-08-15 15 views
6

मैं साइथन दस्तावेज के माध्यम से चल रहा हूं और प्रत्येक उदाहरण ऐप्स का निर्माण कर रहा हूं। मैं सी पुस्तकालयों का उपयोग करने में थोड़ा फंस गया हूँ। सफलतापूर्वक .so फ़ाइल बनाने और इसे एक पायथन फ़ाइल में आयात करने का प्रयास करने के बाद test.py को निम्न त्रुटि फेंक दी गई है।सिथन उत्पन्न जेएसओ आयात करते समय इस आयात त्रुटि का क्या अर्थ है?

$ 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 

.so फ़ाइल test.py फ़ाइल के ठीक आगे बैठती है। तो, ऐसा लगता है कि यह पाया जाना चाहिए। यह ओएसएक्स 10.6 पर पायथन 3.2 के साथ साइथन का नवीनतम संस्करण चला रहा है।

कोई अंतर्दृष्टि?

संपादित करें - कमान और उत्पादन का निर्माण जोड़ने

$ 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 

संपादित करें 2 - जोड़ने "otool" cmd टिप्पणी में अनुरोध

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

संपादित 3 - जोड़ने "एनएम" उत्पादन

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 आउटपुट इस:

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

यह एक लिंकिंग समस्या की तरह लगता है। क्या आप पुनर्निर्माण और निर्माण निर्माण और कमांड दोनों को यहां बनाने के लिए उपयोग कर सकते हैं? – stderr

+0

@ माइक स्टेडर इसे देखने के लिए धन्यवाद, मैंने बिल्ड कमांड और आउटपुट – JeremyFromEarth

+1

जोड़ा है ठीक है, बहुत भाग्य पुन: उत्पन्न नहीं कर रहा है तो चलिए थोड़ा और डिबगिंग करने का प्रयास करें। 'Nm queue.so' आज़माएं और देखें कि _queue_free के आगे क्या सूचीबद्ध है। 'Otool -L queue.so' का भी उपयोग करें और DYLD_LIBRARY_PATH ('echo $ DYLD_LIBRARY_PATH') देखने के लिए जांचें। – stderr

उत्तर

5

संपादित करें:

आह, तुम आप libcalg में कोड पर निर्भरता था का उल्लेख नहीं था। जब आप cextension बनाते हैं तो उस सामान को संकलित और शामिल करने की आवश्यकता होती है।

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

हम पीछे हटना है और यदि आप एक बहुत ही सरल उदाहरण का निर्माण कर सकते देख सकते हैं:

मैं निम्नलिखित (3 फ़ाइलों की कोशिश की है, myext

बस setup.py संशोधित .pyx, test.py, setup.py) और यह ठीक काम करता प्रतीत होता है। बेशक मैं ओएस एक्स 10.7 पर हूं इसलिए यह आपके पर्यावरण के समान नहीं है। मतभेदों को रद्द करने के लिए शायद आप इन्हें कॉपी कर सकते हैं और उन्हें एक स्वच्छता जांच के रूप में बना सकते हैं।

myext.pyx की सामग्री:

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

test.py

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

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 
) 

मैं निर्देशिका इन 3 युक्त निर्माण फ़ाइलें:

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: 

मेरे पर्यावरण में समान ओटोल आउटपुट है और DYLD_LIBRARY_PATH भी अनसेट है लेकिन एनएम-एम परिभाषित के रूप में वर्ग दिखाता है।

विशेष रूप

:

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 

कृपया इस एक शॉट देने और देखें कि यह क्या एनएम -m अपने वातावरण में पता चलता है।

+0

मैंने बस इसे स्थापित और बनाया और यह पूरी तरह से काम करता है। जब मैं "एनएम" चलाता हूं तो मैं वही आउटपुट देखता हूं। केवल एक चीज जिसे मैं बदलना था प्रिंट स्टेटमेंट था क्योंकि मैं पायथन 3.2 का उपयोग कर रहा हूं और आपको माता-पिता का उपयोग करना होगा। – JeremyFromEarth

+1

दिलचस्प ... दुख की बात है, मुझे यकीन नहीं है कि आपके कतार विस्तार के साथ क्या अलग है। क्या आप कोड साझा कर सकते हैं? – stderr

+0

मैं वास्तव में आपकी मदद की सराहना करता हूं! स्रोत फाइलें यहां स्थित हैं: http://whiplax.com/cython_lib_wrapper.zip – JeremyFromEarth

संबंधित मुद्दे