使用 setuptools 创建调用外部 C 库的 cython 包
Using setuptools to create a cython package calling an external C library
我正在尝试编译、安装和 运行 一个我们称之为 myPackage
的包。它包含一个从库 fftw
调用函数 fftw_set_timelimit()
的 *.pyx
文件。目前,当我 运行 一个导入包的脚本 clientScript.py
时,我收到以下错误消息:
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
据我了解(我对 python 和 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 = "me@me.me",
packages=find_packages(),
ext_modules = cythonize("pyClo/pyClo.pyx"),
)
如您所见,我的 setup.py
文件使用 setuptools
。我决定这样做是因为 Python Packaging User Guide. However, the instructions in the Cython documentation 建议改用 distutils
。链接库是通过调用 distutils.Extension('file',['file.pyx'],libraries='fftw')
完成的。如何使用 setuptools
获得相同的结果?
事实证明 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
只是一个纯文本文件。
我正在尝试编译、安装和 运行 一个我们称之为 myPackage
的包。它包含一个从库 fftw
调用函数 fftw_set_timelimit()
的 *.pyx
文件。目前,当我 运行 一个导入包的脚本 clientScript.py
时,我收到以下错误消息:
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
据我了解(我对 python 和 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 = "me@me.me",
packages=find_packages(),
ext_modules = cythonize("pyClo/pyClo.pyx"),
)
如您所见,我的 setup.py
文件使用 setuptools
。我决定这样做是因为 Python Packaging User Guide. However, the instructions in the Cython documentation 建议改用 distutils
。链接库是通过调用 distutils.Extension('file',['file.pyx'],libraries='fftw')
完成的。如何使用 setuptools
获得相同的结果?
事实证明 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
只是一个纯文本文件。