我最近创建了一个基于 distutils (setup.py) 的非常简单的 RPM。当我这样做时
python setup.py bdist_rpm
它会正常生成 RPM。
当我安装此 RPM 后,如果卸载它,它不会删除“/usr/lib/python3/site-packages/mylib”文件夹,就会出现问题。查看它,我可以看到所有 __pycache__ 文件夹都留空。另外,“.egg-info”目录仍然存在。
我的 setup.py 看起来像这样:
import setuptools
setuptools.setup(
name = "mylib",
version = "1.0",
author = "An awesome developer",
description = "An awesome library",
packages = setuptools.find_packages(),
classifiers = [
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 2",
],
)
我确实了解 distutils 中的 bdist_rpm 命令允许设置“postun”脚本。但生成的 RPM 不应该负责清理自己的混乱吗?我在 distutils 环境中做错了什么吗?
import setuptools
postun_path = '/home/tmp/mylib/postun.sh'
postun_script = '''rm -rf /usr/lib/python3/site-packages/mylib
rm -rf /usr/lib/python3/site-packages/python3_mylib*'''
with open(postun_path, 'w+') as f:
f.write(postun_script)
setuptools.setup(
name = "mylib",
version = "1.0",
author = "An awesome developer",
description = "An awesome library",
packages = setuptools.find_packages(),
classifiers = [
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 2",
],
options={'bdist_rpm': {'post_uninstall': postun_path}},
)
为了在卸载生成的 RPM 时手动删除剩余文件,我在 setup.py 的开头添加了一个小 bash 脚本的创建,并将该脚本的路径传递给安装方法的“options”参数。该参数采用与调用 setup.py 时相同的命令行选项的字典,在本例中,您正在查找 bdist_rpm 选项的 post_uninstall 参数。在调用 setup.py 时,我仍然继续传递所有相同的选项,但通过此添加,我发现在卸载软件包的 RPM 后,剩余的站点软件包目录被删除。手动执行此操作当然感觉不对,但通过修改传递给 post_uninstall 的 bash 脚本,您应该能够覆盖所有基础。