Python + setuptools:分发带有 boost.python 绑定的预编译共享库
Python + setuptools: distributing a pre-compiled shared library with boost.python bindings
我有一个 C++ 库(我们在下文中将其称为示例),我使用 boost.python 库为其编写了 Python 绑定。这个 Python-wrapped 库将被称为 pyExample。整个项目是使用 CMake 构建的,生成的 Python-wrapped 库是一个名为 libpyExample.so
.
的文件
当我使用位于与 libpyExample.so
相同目录的 Python 脚本中的 Python 绑定时,我只需编写:
import libpyExample
libpyExample.hello_world()
这会执行包装过程公开的 hello_world()
函数。
我想做什么
为了方便起见,我希望我的 pyExample 库可以在任何地方使用,只需使用命令
import pyExample
我还希望 pyExample 可以通过一个命令轻松安装在任何 virtualenv 中。所以我认为一个方便的过程是使用 setuptools 来实现这一点。因此,这意味着:
- 使
libpyExample.so
对任何 Python 脚本可见
- 更改访问模块的名称
我确实找到了很多关于使用 setuptools 编译 C++ 扩展的东西,但没有找到关于打包预编译的 C++ 扩展的东西。我想做的事有可能吗?
我不想做的事情
我不想用 setuptools 构建 pyExample 库,我想避免过多地修改现有项目。 CMake 构建很好,我可以很容易地检索 libpyExample.so
文件。
如果我没看错你的问题,你的情况是这样的:
- 你有一个现有的 CMake-based 构建的 C++ 库,带有 Python 绑定
- 你想用 setuptools 打包这个库
后者随后允许您调用 python setup.py install --user
,它将 lib 安装在 site-packages
目录中,并使其可从系统中的每个路径访问。
如果您重载 setuptools 用于构建扩展的 类,那么您想要的是可能的,以便那些 类 实际上调用您的 CMake 构建系统。这不是微不足道的,但你可以在这里找到一个工作示例,由 pybind11 项目提供:
https://github.com/pybind/cmake_example
查看 setup.py
,您将看到 类 build_ext
和 Extension
是如何继承和修改以执行 CMake 构建的。
如果您的构建需要设置特殊的 -D
标志,这对您来说应该是开箱即用的,或者稍作修改。
希望对您有所帮助!
我有一个 C++ 库(我们在下文中将其称为示例),我使用 boost.python 库为其编写了 Python 绑定。这个 Python-wrapped 库将被称为 pyExample。整个项目是使用 CMake 构建的,生成的 Python-wrapped 库是一个名为 libpyExample.so
.
当我使用位于与 libpyExample.so
相同目录的 Python 脚本中的 Python 绑定时,我只需编写:
import libpyExample
libpyExample.hello_world()
这会执行包装过程公开的 hello_world()
函数。
我想做什么
为了方便起见,我希望我的 pyExample 库可以在任何地方使用,只需使用命令
import pyExample
我还希望 pyExample 可以通过一个命令轻松安装在任何 virtualenv 中。所以我认为一个方便的过程是使用 setuptools 来实现这一点。因此,这意味着:
- 使
libpyExample.so
对任何 Python 脚本可见 - 更改访问模块的名称
我确实找到了很多关于使用 setuptools 编译 C++ 扩展的东西,但没有找到关于打包预编译的 C++ 扩展的东西。我想做的事有可能吗?
我不想做的事情
我不想用 setuptools 构建 pyExample 库,我想避免过多地修改现有项目。 CMake 构建很好,我可以很容易地检索 libpyExample.so
文件。
如果我没看错你的问题,你的情况是这样的:
- 你有一个现有的 CMake-based 构建的 C++ 库,带有 Python 绑定
- 你想用 setuptools 打包这个库
后者随后允许您调用 python setup.py install --user
,它将 lib 安装在 site-packages
目录中,并使其可从系统中的每个路径访问。
如果您重载 setuptools 用于构建扩展的 类,那么您想要的是可能的,以便那些 类 实际上调用您的 CMake 构建系统。这不是微不足道的,但你可以在这里找到一个工作示例,由 pybind11 项目提供:
https://github.com/pybind/cmake_example
查看 setup.py
,您将看到 类 build_ext
和 Extension
是如何继承和修改以执行 CMake 构建的。
如果您的构建需要设置特殊的 -D
标志,这对您来说应该是开箱即用的,或者稍作修改。
希望对您有所帮助!