如何安装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
    include\u package\u data
    不起作用,因为*.so文件不受版本控制,不在任何包内
  • data\u文件
    似乎不起作用,因为只有在运行
    python setup.py sdist
    时才会包含这些文件,但在
    python setup.py安装
    时会被忽略。这与我想要的正好相反。
    .so
    文件不应包含在源发行版中,而是在安装步骤中进行复制
  • MANIFEST.in
    失败的原因与
    数据文件
    相同
  • eager\u resources
    也不起作用,但老实说,我不知道
    eager\u resources
    data\u文件
    MANIFEST.in
    之间的区别
我认为这实际上是一种常见的情况,我希望有一个简单的解决办法。任何帮助都将不胜感激

移植嵌入在makefiles中的逻辑将是多余的,而且 完全不必要的工作

不幸的是,这正是我必须做的。我已经为同样的问题挣扎了一段时间了

把它移植过来其实也不算太糟,但这在他们这方面是相当随意的。运行SWIG会创建Python文件,当前的构建顺序假定在运行
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社区能在不久的将来解决这个问题。您能满意地解决这个问题吗?我的处境非常相似,可以借鉴你的经验。干杯这可能已经死了,但我也想知道你的解决方案。你找到满意的解决方案了吗?快三年了!我也处于同样的情况。