我正在通过SWIG将一个C库封装到一个Python模块中,这里称为"myExample"。如果我进行编译:
$swig -python myExample.i
$gcc -c myExample_wrap.c -I /usr/lib/python2.7 -fPIC -std=c99
$ld -shared myExample_wrap.so -llapacke -o _myExample.so
我获得了一个完整的工作模块(某些函数需要liblapacke)。现在,我想通过“pip install”来安装这个模块。
根据distutils部分(https://docs.python.org/2.7/distutils/setupscript.html),我编写了我的setup.py文件:
from distutils.core import setup, Extension
setup(name='myExample',
version='0.1',
ext_modules=[Extension('_myExample',['myExample.i'], libraries= ['lapacke'])] )
我编辑了MANIFEST.in以保留源代码并避免类似网站上的问题(即只包含myExample.h和myExample.c)。然后我运行:
$python setup.py sdist
通过“pip install”获得可安装的软件包。看起来已经完成(没有错误,没有警告),但是...它不起作用。在这个可安装模块(“_myExample.so” - 注意下划线,似乎distutils需要它[也许它隐藏了一个答案?])中,一些方法是不同的,一些缺失了,等等...因此,我决定一步一步地进行。只编译:
$python setup.py build_ext
我已经遇到了同样的问题:最终模块与开头解释中所述的传统编译得到的模块不同。
总结一下:给定一个SWIG接口,通过传统方式编译它或通过distutils编译都会产生不同的结果。这可能怎么可能?我的setup.py有问题吗?难道有其他方法可以获得一个可pip安装的模块,而不依赖于distutils或setuptools(它们产生相同的问题)?
附注:包装代码非常长,所以我不能详细列出,但如果需要,我完全可以添加更多信息。例如,手动编译的接口成功包含“AdaptiveInterpolation”(运行良好),而distutil生成的接口具有“AdaptiveInterpolation_set”、“AdaptiveInterpolation_get”,或者有很多以“new_”开头的方法(原始代码中不存在)。