【问题标题】:How do I package for distribution a python module that uses a shared library?如何打包以分发使用共享库的 python 模块?
【发布时间】:2014-07-31 13:28:12
【问题描述】:

我正在为 C 库编写一些绑定,但不确定如何配置所有这些以进行分发,因此可以 pip install 我的包。

假设我有以下文件:

  • library.c
  • library.h
  • wrapper.py

为了让我的包装库工作,有必要:

  • 编译 library.c 并创建一个共享库
  • library.h 上运行ctypesgen 以生成ctypes 代码

命令如下:

  • gcc -Wall -fPIC -c library.c
  • gcc -shared -Wl,-soname,liblibrary.so.1 -o liblibrary.so.1.0 library.o
  • ctypesgen.py library.h -L ./ -l library -o _library.py

运行setup.py 还取决于安装了ctypesgen 的用户。

我不知道如何设置这一切,以便对图书馆感兴趣的人可以简单地pip install library 并让这一切自动发生。有谁能帮忙吗?

【问题讨论】:

  • 您可以将所需依赖项的import 放在安装脚本顶部的try/except 中,并将用于pip 安装依赖项的代码放在except 块中
  • 不,我认为您需要将其放入 install_requires 或类似指令中。
  • 是的,那会更正确,我不确定如何。旁注,我从你的博客中认出了你的 SO 用户名,我喜欢你关于马尔科夫链的帖子,用它作为我自己的马尔科夫链 irc bot 的基础:)
  • 请注意,要求是 C 库 - 它的“分发版”(library.so + library.h)不是 Python 包,自然不会在 PyPI 上列出(因此依赖项不起作用) .

标签: python ctypes setuptools distutils


【解决方案1】:

setuptools/distutils 的扩展功能正是您所需要的。

Documentation has more information,简而言之,执行上述操作的 setup.py 示例如下所示

from setuptools import setup, find_packages, Extension

extensions = [Extension("my_package.ext_library",
                       ["src/library.c"],
                       depends=["src/library.h"],
                       include_dirs=["src"],
              ),
]
setup(<..>,
     ext_modules=extensions,
)

.so 是在构建模块时由setup.py 自动生成的。如果它需要链接到其他库,可以为扩展提供一个libraries 参数列表。有关详细信息,请参阅文档 (1)。

由于这是 setuptools 的内置功能,它可以与pip 一起正常工作,并且可以在 pypi 上分发(仅作为源代码)。 Extension 引用的所有源文件都必须存在于分布式 pypi 存档中。

如果您想构建可分发的二进制轮子,包括本机代码see manylinux

【讨论】:

  • 这段代码对我来说很完美,但库的名称似乎会因系统而异。对于我的系统,库被命名为ext_library.cpython-36m-x86_64-linux-gnu.so。如何预测包的名称以在我的 python 脚本中导入它?
  • 你不需要。文件名是根据解释器版本和体系结构自动生成的。导入时仅使用设置扩展时使用的名称,例如上面的import my_package.ext_library
  • 要将头文件添加到 tar.gz 源包中,需要一个 MANIFEST.in 文件。 python3 -m build 使用sdist 生成tar.gz,默认不包含头文件。 setup.cfgsetup.py 文件无济于事。
猜你喜欢
  • 2013-07-03
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2018-09-16
  • 2013-07-15
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多