使用distribute/setuptools创建符号链接(或运行脚本)?

10 投票
3 回答
4979 浏览
提问于 2025-04-15 18:37

在我项目的设置过程中,我需要把一个包的符号链接(symlink)指向一个指定的目录,这样一个 init.d 脚本才能找到它。有没有办法把这个操作加到 setup() 的后处理命令里?我甚至可以接受创建另一个文件来生成这个链接,然后把它作为某个参数传给 setup(),如果有这样的选项的话。

setup(
    ...
    packages = find_packages('src'),
    package_dir = {'': 'src'},
    install_requires = ...,
    data_files = [('/etc/init.d', ['scripts/foo'])],
    ...
)

这个 foo 脚本需要从 src/ 目录中的一个包创建符号链接到其他地方(比如说,不仅仅是放在 PYTHONPATH 中)。有没有办法做到这一点?

3 个回答

0

在@pjeby的回答基础上,你还可以扩展安装命令,添加自己想要的后续步骤。不过,这样的做法只在从源代码安装时有效(也就是运行setup.py的时候),其他的安装工具,比如RPM和MSI,会默默忽略你所做的更改。

编辑:经过一些搜索后发现,似乎不应该自己去创建符号链接:http://docs.python.org/2/install/index.html#alternate-installation

9

我知道这篇帖子已经好几年了,但我想更新一下,告诉大家在setup.py中是可以进行后处理的。简单来说,你需要重写setuptools的安装功能,从那以后你就可以添加任何你想要的代码,比如复制MANIFEST.in不愿意复制的符号链接。这是来自Peter Lamut的解决方案

from setuptools.command.install import install

class CustomInstallCommand(install):
    """Customized setuptools install command - prints a friendly greeting."""
    def run(self):
        print "Hello, developer, how are you? :)"
        install.run(self)
        #post-processing code
setup(
    ...
    cmdclass={
        'install': CustomInstallCommand,
    },
    ...
)
4

目前,只有一些特定平台的包管理工具(比如RPM、deb、win32安装程序)可以在安装后执行一些步骤:像distutils、setuptools这些工具并不直接支持这个功能。(除了它们可以让你构建RPM、Windows安装程序等。)

所以,如果你想在没有特定平台安装程序的情况下做到这一点,最简单的方法就是自己创建一个后安装脚本,或者在你现有的脚本中添加一个后安装选项,然后告诉用户去运行它。否则,你就得使用bdist_rpm或者其他bdist命令来为合适的平台构建一个安装程序。

撰写回答