我有一个C ++项目,我正在开发一个Python接口。现在我正在使用pybind11,因为它看起来非常整洁,并且有一些很好的工具可以用CMake构建扩展模块,这就是构建主要C ++项目的方式。
通过CMake我设法获得了一个包含要构建的接口函数的共享库,但是现在我已经拥有它了,我不知道如何告诉Python它存在并使其可导入。我不想重新配置要通过Python启动的项目的整个构建(即如here所述的setuptools),因为它是一个大项目,我只是提供一个Python接口来部分。因此,如果我可以为Python构建共享库以及其余的C ++代码,然后稍后运行" setup.py install"做任何其他事情都需要做,以使共享库对Python可见。
这可能吗?或者我是否需要进行其他类型的重构,例如让主项目构建一些其他纯C ++库,然后我只链接到通过setuptools单独构建的Python扩展模块库?
答案 0 :(得分:2)
如果您只需安装一个二进制模块,则可以为该模块创建一个简单的安装程序。假设您已经使用cmake生成的构建脚本构建了二进制模块foo.so
(如果您正在使用Windows,则为foo.pyd
)。然后,您可以创建一个简单的设置设置脚本:
from setuptools import setup
setup(
name='foo',
version='0.1.2.3',
py_modules=['foo']
)
然后您需要添加MANIFEST.in
文件来选择二进制模块文件:
include foo.so
所以你需要3个文件:
foo.so
MANIFEST.in
setup.py
现在您可以从Python虚拟环境中执行python setup.py install
,并在其中安装二进制模块。如果要分发模块,则最好安装Python wheel
包并创建.whl
文件:python setup.py bdist_wheel
。稍后可以使用pip
命令安装此类“轮”。请注意,二进制模块必须安装在用于构建这些模块的同一平台和Python版本上。