如何导入或安装预编译的Python扩展模块(C++)(即非通过setuptools编译的库)?

4
我有一个C++项目,正在开发Python接口。目前我正在使用pybind11,因为它似乎非常不错,并且具有一些很好的工具来使用CMake构建扩展模块,这是主C++项目的构建方式。
通过CMake,我成功构建了包含接口函数的共享库,但是现在我不知道如何告诉Python它存在并使其可导入。我不想重新配置整个项目的构建以通过Python启动(即如此处所述使用setuptools),因为这是一个大项目,我只是为其中的一部分提供Python接口。因此,最好的方法是将共享库与其他C++代码一起构建到Python中,然后稍后运行“setup.py install”来执行其他需要完成的操作,以使共享库对Python可见。
这可行吗?还是我需要进行其他类型的重构,例如使主项目构建其他纯C++库,然后仅将其链接到通过setuptools分别构建的Python扩展模块库中?

这个二进制模块是独立的还是作为某个Python包的一部分,该包包含了纯Python模块呢? - Roman Miroshnychenko
它是独立的,至少目前是这样。让我们假设它是 : )。我已经在重构选项方面取得了一些进展,我想知道第一种方法是否可行,虽然我认为重构选项更加灵活。 - Ben Farmer
1个回答

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

setup(
    name='foo',
    version='0.1.2.3',
    py_modules=['foo']
)

然后您需要添加MANIFEST.in文件来选择您的二进制模块文件:

include foo.so

所以你需要三个文件:

foo.so
MANIFEST.in
setup.py

现在你可以在Python虚拟环境中执行python setup.py install,这样你的二进制模块就会被安装在其中。如果你想分发你的模块,最好安装Python wheel包并创建一个.whl文件:python setup.py bdist_wheel。这样的“wheel”之后可以通过pip命令进行安装。请注意,二进制模块必须在与用于构建这些模块的平台和Python版本相同的平台和Python版本上进行安装。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接