如何打包一个使用共享库的Python模块以便分发?

16 投票
1 回答
4285 浏览
提问于 2025-04-18 09:19

我正在为一个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 来自动完成所有这些步骤。有没有人能帮帮我?

1 个回答

9

你需要的是setuptools/distutils的扩展功能。

文档里有更多信息,简单来说,下面这个例子就是一个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包里。

如果你想构建可分发的包含本地代码的二进制轮子,可以参考manylinux

撰写回答