2015-09-11 72 views
11

我正在編譯,安裝並運行一個包,我們將其稱爲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獲得相同的結果?

回答

13

事實證明,setuptools有一個模塊setuptools.extension.Extension,它與distutils.extension.Extension模塊的使用方式相同。

在年底,setup.py文件看起來像:

from setuptools import setup, find_packages 
from setuptools.extension import Extension 
from Cython.Build import cythonize 

extensions = [ 
    Extension(
     "myPackage.myModule", 
     ["myPackage/myModule.pyx"], 
     include_dirs=['/some/path/to/include/'], # not needed for fftw unless it is installed in an unusual place 
     libraries=['fftw3', 'fftw3f', 'fftw3l', 'fftw3_threads', 'fftw3f_threads', 'fftw3l_threads'], 
     library_dirs=['/some/path/to/include/'], # not needed for fftw unless it is installed in an unusual place 
    ), 
] 

setup(
    name = "myPackage", 
    packages = find_packages(), 
    ext_modules = cythonize(extensions) 
) 

這裏是我的安裝目錄的概述:

. 
├── MANIFEST.in 
├── myPackage 
│   └── myModule.pyx 
├── README.rst 
└── setup.py 

其中myModule.pyx是調用fftw_set_timelimit()文件。

MANIFEST.in包含:

include myPackage/*.* 

README.rst僅僅是一個純文本文件。

+1

根據[distutils的文檔】(https://docs.python.org/2/distutils/apiref.html#distutils.core.Extension),'distutils.core.Extension'需要作爲第一個參數: 「_擴展名的全稱,包括任何包,即不是文件名或路徑名,但Python虛線名稱」 因此,應該使用myPackage.myModule而不是''myPackage/myModule'''。 – SylM

+0

@SylM我一段時間以來一直沒有使用python ...因此,我需要仔細檢查是否用斜槓「/」替換斜槓「/」。正如你所暗示的那樣確實有效。但是,如果您測試解決方案並告訴我沒關係,那麼我會相應地編輯我的答案。通過「測試解決方案」,我的意思是從頭開始一個新項目,並確保可以使其工作。你想這樣做嗎? ;) –

+0

@GLorieul我剛剛使用上面的模板使用虛線名稱語法,併成功編譯。 – Gilly