如何打包一个使用共享库的Python模块以便分发?
我正在为一个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。