Python 库发布最佳实践

8 投票
1 回答
600 浏览
提问于 2025-04-16 13:17

我用ctypes写了Python的绑定,连接到units库。这些绑定代码大约只有100行Python。这个库有一个不必要的依赖关系,就是需要tcl,但对于Python绑定来说其实并不需要。如果没有tcl,配置脚本会出错。不过,使用命令gcc -Wl,-soname,units.so -o units.so -fPIC -shared units.c编译这个库是没问题的。

现在我想发布这些绑定,有三种方式可以选择。

  1. 单独发布绑定,配上一个简单的setup.py,并在文档中提供C库的构建、下载和安装说明。
  2. 发布绑定,同时提供原始库的源代码,并提供一个setup.py来处理C库的编译和安装。这显然需要我做更多的工作。
  3. 只发布.py文件,让用户自己处理安装和依赖问题。

如果我选择第二种方式,库应该放在哪里呢?是把它放在和.py文件同一个目录里,这样我可以假设lib_name = CDLL('./units.extension'),还是应该放在一个通常在链接器路径中的目录(比如/lib)?另外,Windows机器通常是怎么处理这个问题的,因为a) 可能没有C编译器,b) 没有标准的地方放共享库?

这三种选择中哪种是更好的?我应该怎么处理Windows的情况?

1 个回答

2

看起来这个 units 库已经有超过5年没有更新了,所以第二个选项可能是最好的选择。而且,像Ubuntu Lucid或Macports这样的主要发行版也不太可能会把它打包进来,我在这些地方找不到它。

比如,你可以把 units.cunits.h 这两个文件复制到你的项目里,然后创建一个 setup.py 文件,用来编译和部署它,以及你的绑定代码:

from setuptools import setup, Extension

sources = ['src/units.c']
ext_opts = {'extra_compile_args': ['-Wl,-soname,units.so', '-Isrc']}

setup(
    name='units',
    ext_modules = [Extension('units', sources, **ext_opts)]
    )

撰写回答