Python+;setuptools:分发带有boost.python绑定的预编译共享库 我有一个C++库(下面我们将它称为示例),我使用BooSt.python库编写了Python绑定。这个Python包装的库将被称为pyExample。整个项目是使用CMake构建的,生成的Python包装库是一个名为libpyExample.so的文件
当我使用与Python+;setuptools:分发带有boost.python绑定的预编译共享库 我有一个C++库(下面我们将它称为示例),我使用BooSt.python库编写了Python绑定。这个Python包装的库将被称为pyExample。整个项目是使用CMake构建的,生成的Python包装库是一个名为libpyExample.so的文件,python,c++,boost,setuptools,Python,C++,Boost,Setuptools,当我使用与libpyExample.so位于同一目录中的Python脚本中的Python绑定时,我只需编写: import libpyExample libpyExample.hello_world() 这将执行包装过程公开的hello\u world()函数 我想做什么 为了方便起见,我希望我的pyExample库可以在任何地方使用,只需使用命令 import pyExample 我还希望pyExample可以很容易地安装在任何virtualenv中,只需一个命令。所以我认为一个方便的过程
libpyExample.so
位于同一目录中的Python脚本中的Python绑定时,我只需编写:
import libpyExample
libpyExample.hello_world()
这将执行包装过程公开的hello\u world()
函数
我想做什么
为了方便起见,我希望我的pyExample库可以在任何地方使用,只需使用命令
import pyExample
我还希望pyExample可以很容易地安装在任何virtualenv中,只需一个命令。所以我认为一个方便的过程是使用setuptools来实现这一点。因此,这意味着:
- 使
对任何Python脚本都可见libpyExample.so
- 更改访问模块时使用的名称
我不想用setuptools构建pyExample库,我希望避免过多地修改现有项目。CMake构建很好,我可以检索
libpyExample。因此
文件非常容易。如果我正确理解您的问题,您会遇到以下情况:
-
<> LI>使用Python绑定有一个现有的基于Cube的C++库的构建
- 您想使用setuptools打包此库
python setup.py install--user
,它将lib安装在site packages
目录中,并使其可从系统中的每个路径使用
如果您重载setuptools用于构建扩展的类,使这些类实际调用您的CMake构建系统,那么您想要的是可能的。这并不简单,但您可以在这里找到pybind11项目提供的一个工作示例:
查看setup.py
,您将看到类build\u ext
和Extension
是如何继承和修改以执行CMake构建的
如果您的构建需要设置特殊的-D
标志,这应该是现成的,或者只需稍加修改。
我希望这有帮助 正确的方法是将编译作为设置过程的一部分。如果是C++代码,我会加倍推荐重新编译。我知道,但是库不是跨平台,改变构建系统真的很复杂。我在检查时发现了一个肮脏的解决办法。我刚刚(1)创建了一个
pyExample
目录,其中包含用于名称空间重命名的init脚本,(2)将我的libpyExample.so
文件注册为包数据文件(它没有被识别为包文件,我不知道为什么)和(3)在调用setup
函数时,确保zip\u-safe
参数设置为False
。现在,setup.py
工作正常。这并没有完全回答最初的问题,实际上是按照@Petesh的评论逻辑进行的。然而,根据经验(我在2年多前问过这个问题),我认为这确实是可行的,尤其是现在pybind11让事情变得如此简单。如果原始问题没有正确回答,你可以让我知道我误解了什么,然后我可以改进答案@Petesh没有给出任何实现这些细节的细节。我在发布这个问题时所想到的目标是手工编译C++库(即通过调用CMake并从终端中制作),复制所得的<代码>。安装到Python包文件树中的适当位置,并使用安装脚本将其安装到Python文件树中。您在回答中提出的建议更加优雅,它不需要修改构建过程,并且可以通过pybind11方便地实现。我想它解决了我当时的问题(我接受答案的原因)。啊,我现在明白了。很抱歉,对于您原来的问题,我的答案来得太晚,谢谢您接受答案:)