通过Python模块分发预构建库

5 投票
1 回答
2586 浏览
提问于 2025-04-16 18:42

我用下面的脚本来分发一个包含纯Python代码的模块。

from distutils.core import setup, Extension
import os
setup (name = 'mtester',
       version = '0.1',
       description = 'Python wrapper for libmtester',
       packages=['mtester'],
       package_dir={'mtester':'module'},
       )

我遇到的问题是,我修改了一个使用外部库的文件(一个 .so 文件),我需要把这个文件和现有模块一起打包。有人建议我使用 package_data 来包含这个库。我把脚本修改成了下面这样。

from distutils.core import setup, Extension
import os
data_dir = os.path.abspath('../lib64/')
setup (name = 'mtester',
       version = '0.1',
       description = 'Python wrapper for libmtester',
       packages=['mtester'],
       package_dir={'mtester':'module'},
       package_data={'mtester':[data_dir+'mhelper.so']},
       )

问题是,添加 package_data 并没有带来任何变化。这个库 mhelper.so 并没有安装到任何地方(既没有在 site-packages 里,也没有在 site-packages/mtester 里)。

系统信息:Fedora 10,64位,Python 2.5(是的,这个版本很老。但这是我们的构建机器,需要保持这样以兼容旧版本)

如果有任何建议能帮助我解决这个问题,我会非常感激!

1 个回答

2

很遗憾,package_data 是根据包的顶层来查找文件的。一个解决办法是把辅助库移动到模块目录下,和其他代码放在一起:

% mv lib64/mhelper.so module/

然后相应地修改 package_data 的参数:

package_data = {'mtester': ['mhelper.so']}
...

接着进行测试:

% python setup.py bdist
% tar tf dist/mtester-0.1.linux-x86_64.tar.gz | grep mhelper
./usr/local/lib/python2.5/dist-packages/mtester/mhelper.so

撰写回答