2014-04-29 45 views
4

我有一個二進制文件,它可以加載.so共享對象來擴展功能。這些擴展以C++編碼,但我想使用一些預編碼的python函數,所以我利用了Python C API。到現在爲止還挺好。使用Python C API時導入錯誤

呼叫到Python功能很好的工作,但如果在Python中,我輸入spidev模塊我得到以下錯誤:

import spidev 
ImportError: /usr/local/lib/python2.7/dist-packages/spidev.so: undefined symbol: _Py_ZeroStruct 
Segmentation fault 

如果我進口標準的模塊(SYS,OS,argparse ...)這裏沒有問題。

可能是什麼問題?我知道我可以直接從C++使用spidev,但我想盡可能重用現有的Python代碼。

UPDATE:

作爲@BrianCain和@qarma指出的那樣,它可以是具有依賴於libpython相關的問題,所以我包括ldd輸出:

$ ldd myextension.so 
    /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f89000) 
    libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6f5f000) 
    libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6f54000) 
    libutil.so.1 => /lib/arm-linux-gnueabihf/libutil.so.1 (0xb6f49000) 
    libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6ed8000) 
    libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0 (0xb6c47000) 
    libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6c1f000) 
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6af0000) 
    /lib/ld-linux-armhf.so.3 (0xb6fa2000) 
    libz.so.1 => /lib/arm-linux-gnueabihf/libz.so.1 (0xb6ad2000) 

$ ldd /usr/local/lib/python2.7/dist-packages/spidev.so 
    /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6ed3000) 
    libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6ea9000) 
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6d7a000) 
    /lib/ld-linux-armhf.so.3 (0xb6eed000) 

UPDATE2:

spidev安裝的輸出。

$ sudo pip install spidev 
Downloading/unpacking spidev 
    Downloading spidev-2.0.tar.gz 
    Running setup.py egg_info for package spidev 

Installing collected packages: spidev 
    Running setup.py install for spidev 
    building 'spidev' extension 
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/src/linux/include -I/usr/include/python2.7 -c spidev_module.c -o build/temp.linux-armv6l-2.7/spidev_module.o 
    gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-armv6l-2.7/spidev_module.o -o build/lib.linux-armv6l-2.7/spidev.so 

Successfully installed spidev 
Cleaning up... 

$ ldd /usr/local/lib/python2.7/dist-packages/spidev.so 
    /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f97000) 
    libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6f6d000) 
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e3e000) 
    /lib/ld-linux-armhf.so.3 (0xb6fb1000) 

還沒取決於libpython ...

+3

有可能是'spidev.so'構建的'libpython'不是當前正在執行的Python VM使用的'libpython'。 –

+0

請包括你的'pip install'或'python setup.py install'的日誌。適用於Linux x86-64本機Python-2.7.6,distutils-2.7.6,gcc-4.8.2 –

+0

添加了'pip install'日誌。謝謝! –

回答

0

我懷疑你的spidev.so是建立針對錯誤版本的Python或內置嚴重。

請在您的Python和這個庫上運行ldd。如果不匹配,那就太難運了!如果沒有,深入挖掘。

下面是它如何工作:

(test)[[email protected] py-spidev]$ python setup.py build 
(test)[[email protected] py-spidev]$ ldd build/lib.linux-x86_64-2.7/spidev.so 
     linux-vdso.so.1 (0x00007fffbadfe000) 
     libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0 (0x00007f42c9659000) 
     libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f42c943c000) 
     libc.so.6 => /usr/lib/libc.so.6 (0x00007f42c9094000) 
     libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f42c8e8f000) 
     libutil.so.1 => /usr/lib/libutil.so.1 (0x00007f42c8c8c000) 
     libm.so.6 => /usr/lib/libm.so.6 (0x00007f42c898b000) 
     /usr/lib64/ld-linux-x86-64.so.2 (0x00007f42c9c50000) 
(test)[[email protected] py-spidev]$ python setup.py install 
(test)[[email protected] py-spidev]$ python 
>>> import spidev 
>>> dir(spidev) 
['SpiDev', '__doc__', '__file__', '__name__', '__package__'] 

需要注意的是,應該對一些libpython2.x.so.y.z

也許你的目標蟒蛇鏈接(如果交叉編譯)丟失?

+0

我在原始問題中包含'ldd'輸出。似乎'spidev.so'不依賴'libpython'。是對的嗎?謝謝! –

+1

你的spidev.so編寫得很糟糕!它應該與特定版本的python運行時間鏈接,例如'libpython2.7.so.1.0' –