我正在編譯,安裝並運行一個包,我們將其稱爲myPackage
。它包含一個*.pyx
文件,該文件從庫fftw
調用函數fftw_set_timelimit()
。目前,當我運行一個腳本clientScript.py
一個導入包我獲得以下錯誤消息:使用setuptools創建一個調用外部C庫的cython包
Traceback (most recent call last):
File "clientScript.py", line 5, in <module>
import myPackage.myModule
ImportError: /usr/local/lib/python2.7/dist-packages/myPackage/myModule.so: undefined symbol: fftw_set_timelimit
據我瞭解(我很新的蟒蛇,並用Cython),與C庫,該鏈接爲尚未在我的包裝中執行。事實上,我setup.py
文件看起來像這樣:
from setuptools import setup,find_packages
from Cython.Build import cythonize
import os
setup(
name = "myPackage",
version = "0.0.1",
url = "none",
author = "me",
author_email = "[email protected]",
packages=find_packages(),
ext_modules = cythonize("pyClo/pyClo.pyx"),
)
正如你可以看到我的setup.py
文件使用setuptools
。我決定這樣做,因爲它是由Python Packaging User Guide推薦的。但是,Cython documentation中的說明改爲使用distutils
。鏈接庫是通過致電distutils.Extension('file',['file.pyx'],libraries='fftw')
完成的。我如何使用setuptools
獲得相同的結果?
根據[distutils的文檔】(https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension),'distutils.core.Extension'需要作爲第一個參數: 「_擴展名的全稱,包括任何包,即不是文件名或路徑名,但Python虛線名稱」 因此,應該使用myPackage.myModule而不是''myPackage/myModule'''。 – SylM
@SylM我一段時間以來一直沒有使用python ...因此,我需要仔細檢查是否用斜槓「/」替換斜槓「/」。正如你所暗示的那樣確實有效。但是,如果您測試解決方案並告訴我沒關係,那麼我會相應地編輯我的答案。通過「測試解決方案」,我的意思是從頭開始一個新項目,並確保可以使其工作。你想這樣做嗎? ;) –
@GLorieul我剛剛使用上面的模板使用虛線名稱語法,併成功編譯。 – Gilly