3

我有一个 C++ 项目,我正在为其开发 Python 接口。现在我正在使用pybind11,因为它看起来很整洁,并且有一些很好的工具可以用 CMake 构建扩展模块,这就是主要的 C++ 项目的构建方式。

通过 CMake,我设法获得了一个包含要构建的接口函数的共享库,但是现在我有了它,我不知道如何告诉 Python 它存在并使其可导入。我不想重新配置要通过 Python 启动的项目的整个构建(即这里使用 setuptools 描述的),因为它是一个大项目,我只是为其中的一部分提供 Python 接口。因此,如果我可以只为 Python 构建共享库以及其余的 C++ 代码,然后稍后运行“setup.py install”来做任何其他需要做的事情以使共享库可见,那将是更可取的到 Python。

这可能吗?还是我需要做一些其他类型的重构,比如让主项目构建一些其他纯 C++ 库,然后我只需将其链接到通过 setuptools 单独构建的 Python 扩展模块库?

4

1 回答 1

5

如果您只需要安装一个二进制模块,您可以为该模块创建一个简单的安装程序。假设您有一个二进制模块foo.so(或者foo.pyd如果您在 Windows 上工作),该模块已经使用您的 cmake 生成的构建脚本构建。然后您可以创建一个简单的设置设置脚本:

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 setup.py install在 Python 虚拟环境中进行操作,并且您的二进制模块将安装在其中。如果你想分发你的模块,那么最好安装 Pythonwheel包并创建一个.whl文件:python setup.py bdist_wheel. 这样的“轮子”以后可以用pip命令安装。请注意,二进制模块必须安装在用于构建这些模块的相同平台和 Python 版本上。

于 2017-11-22T11:07:28.543 回答