如何安装C++;图书馆 影像,我们得到一个完整的C++源代码库,叫做 MyAWESOMILB 。我们的目标是向python展示它的一些功能,因此我们使用swig创建了一个包装器,并生成了一个名为PyMyAwesomeLib的python包
目录结构现在看起来像如何安装C++;图书馆 影像,我们得到一个完整的C++源代码库,叫做 MyAWESOMILB 。我们的目标是向python展示它的一些功能,因此我们使用swig创建了一个包装器,并生成了一个名为PyMyAwesomeLib的python包,python,swig,setuptools,distutils,setup.py,Python,Swig,Setuptools,Distutils,Setup.py,目录结构现在看起来像 root_dir |-src/ |-lib/ | |- libMyAwesomeLib.so | |- _PyMyAwesomeLib.so |-swig/ | |- PyMyAwesomeLib.py |-python/ |- Script_using_myawesomelib.py 到目前为止还不错。理想情况下,我们下一步要做的就是以pythonic方式将lib/*.soswig/*.py和python/*.py复制到站点包中相应的目录中,
root_dir
|-src/
|-lib/
| |- libMyAwesomeLib.so
| |- _PyMyAwesomeLib.so
|-swig/
| |- PyMyAwesomeLib.py
|-python/
|- Script_using_myawesomelib.py
到目前为止还不错。理想情况下,我们下一步要做的就是以pythonic方式将lib/*.so
swig/*.py
和python/*.py
复制到站点包
中相应的目录中,即使用
python setup.py install
然而,当我试图使用setuptools
和distutils
实现这个简单的目标时,我感到非常困惑。这两种工具都通过内部系统处理python扩展的编译,在内部系统中,源文件、编译器标志等通过setup(ext_module=[Extension(…)])
传递。但这是荒谬的,因为MyAsesomeLib
有一个基于makefile的功能完备的构建系统。移植嵌入到makefiles中的逻辑是多余的,完全是不必要的工作
经过一些研究,似乎剩下两个选项,我可以覆盖setuptools.command.build
和setuptools.command.install
以使用现有的makefile并直接复制结果,或者我可以让setuptools
知道这些文件,并要求它在安装过程中复制它们。第二种方式更吸引人,但这是最让我头疼的。我尝试了以下选项,但没有成功
和package\u data
不起作用,因为*.so文件不受版本控制,不在任何包内include\u package\u data
似乎不起作用,因为只有在运行data\u文件
时才会包含这些文件,但在python setup.py sdist
时会被忽略。这与我想要的正好相反。python setup.py安装
文件不应包含在源发行版中,而是在安装步骤中进行复制.so
失败的原因与MANIFEST.in
相同数据文件
也不起作用,但老实说,我不知道eager\u resources
和eager\u resources
或data\u文件
之间的区别MANIFEST.in
build\u ext
之前,所有Python文件都已入账。这一点不难理解,但令人恼火的是,他们声称支持SWIG,却没有提及这一点。Distutils试图在编译东西时跨平台,因此使用它仍然有优势
如果您不想移植整个构建系统,请使用系统的包管理器。许多复杂的库都会这样做(但它们也会尽力使用setup.py)。例如,要在Ubuntu上获得numpy和lxml,您只需执行以下操作:
sudo apt get install python numpython lxml
。没有点子
我意识到您宁愿编写一个安装文件,而不是处理每个包管理器,因此这可能不是很有帮助
如果您尝试使用setuptools,我会遇到一个致命的缺陷:依赖性
例如,如果您正在分发一个基于SWIG的项目,它将需要libpython。如果他们没有,就会发生如下错误:
#include <Python.h>
error: File not found
#包括
错误:找不到文件
这对普通用户来说是毫无帮助的
更糟糕的是,如果您需要一个共享库,但用户的库已过时,用户可能会出现一些疯狂的错误。你可以在他们的C++编译器中输出谷歌友好的错误信息,这样他们就可以算出。p>
长期的解决方案是让setuptools/distutils更好地检测非python库,有望与Ruby的gem一样好。我几乎不得不自己滚。例如,在我正在研究的这篇文章中,你可以看到顶部的一些函数,这些函数是我为依赖关系检测而拼凑在一起的(仍然不能在所有系统上工作……绝对不能在Windows上工作) 我感谢你的意见。不幸的是,我的包有许多非平凡的依赖项。为一些常见的包管理系统准备预编译包是目前最好的选择。我希望python社区能在不久的将来解决这个问题。您能满意地解决这个问题吗?我的处境非常相似,可以借鉴你的经验。干杯这可能已经死了,但我也想知道你的解决方案。你找到满意的解决方案了吗?快三年了!我也处于同样的情况。