当前位置: 首页 > 知识库问答 >
问题:

如何导入或安装预构建的python扩展模块(C)(即未通过setuptools编译的库)?

章彬郁
2023-03-14

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

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

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

共有1个答案

子车心思
2023-03-14

如果您只需要安装一个二进制模块,您可以为该模块创建一个简单的安装程序。让我们假设您有一个二进制模块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虚拟环境中做pythonsetup.py安装,你的二进制模块将安装在其中。如果你想分发你的模块,那么最好安装Python包,并创建一个. whl文件:pythonsetup.pybdist_wheel。这样的"轮"以后可以安装pip命令。请注意,二进制模块必须安装在用于构建这些模块的相同平台和Python版本上。

 类似资料:
  • 问题内容: 我有一个Python项目,其中包含许多与distutils打包在一起的子模块。我想在C中构建一些Python扩展以生活在其中一些子模块中,但是我不明白如何使Python扩展生活在子模块中。以下是我正在寻找的最简单的示例: 这是我的Python扩展: 这是可行的: 在virtualenv中安装后,我可以这样做: 但是,我想生活在一个子模块中。我需要在此管道中进行哪些更改才能使Python

  • 问题内容: 我有一个C扩展模块,很高兴分发内置的二进制文件。SetupTools使得在OS X和GNU / Linux上构建扩展模块变得很容易,因为那些OS随GCC一起提供,但是我不知道如何在Windows中进行。 我需要购买Visual Studio的副本,还是可以使用Visual Studio Express?我可以只使用Cygwin或MinGW吗? 问题答案: 您可以同时使用MinGW和VC

  • 问题内容: 我想修改setup.py文件,以便命令“ python setup.py build”编译基于C的扩展模块,该模块静态(而非动态)链接到库。 该扩展程序当前动态链接到许多库。除了静态链接到一个库外,我想保留所有内容。我已经成功地通过手动修改了对distutils运行的gcc的调用来完成了此操作,尽管它要求我明确列出相关库。 也许这是太多信息,但是为了清楚起见,这是在“ python s

  • 问题内容: 我已经尝试了很多发布在网络上的解决方案,但是它们没有用。 因此系统可以找到_imaging,但仍不能使用truetype字体 引发此错误: 问题答案: 您安装的PIL编译时没有libfreetype。 您可以在此处获得PIL的预编译安装程序(与libfreetype一起编译)(以及许多其他预编译的Python C模块): http://www.lfd.uci.edu/~gohlke/p

  • 问题内容: 我正在使用node_swiz模块,而后者又使用了验证器模块。 我想对验证器模块进行更改,但是我使用npm install来安装模块/依赖项。 我可以只在node_modules内部更改验证器模块,还是在发布到heroku或下次运行npm install时重新创建node_modules依赖关系并获得最新版本? 结构如下: 谢谢您的帮助! 问题答案: 您可以直接编辑文件,但是每当npm更

  • 我使用的是node_swiz模块,它反过来使用验证器模块。 我想对验证器模块进行更改,但我使用了npm安装来安装模块/依赖项。 我是否可以只更改node_模块内部的验证程序模块,或者在我发布到heroku或下次运行npm安装时是否会重新创建node_模块依赖项并获取最新版本? 结构如下所示: 谢谢你的帮助!