Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python+;setuptools:分发带有boost.python绑定的预编译共享库 我有一个C++库(下面我们将它称为示例),我使用BooSt.python库编写了Python绑定。这个Python包装的库将被称为pyExample。整个项目是使用CMake构建的,生成的Python包装库是一个名为libpyExample.so的文件_Python_C++_Boost_Setuptools - Fatal编程技术网

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来实现这一点。因此,这意味着:

  • 使
    libpyExample.so
    对任何Python脚本都可见
  • 更改访问模块时使用的名称
我发现了很多关于用StupUpToice编译C++扩展的东西,但没有涉及打包预编译的C++扩展。我想做的事情可能吗

我不想做的事
我不想用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方便地实现。我想它解决了我当时的问题(我接受答案的原因)。啊,我现在明白了。很抱歉,对于您原来的问题,我的答案来得太晚,谢谢您接受答案:)