【问题标题】:Use distribute/setuptools to create symlink (or run script)?使用分发/设置工具创建符号链接(或运行脚本)?
【发布时间】:2023-11-15 21:57:01
【问题描述】:

作为我项目设置过程的一部分,我需要将其中一个包符号链接到指定目录,以便 init.d 脚本可以找到它。有没有办法将它作为后处理命令添加到setup()?我什至愿意创建另一个文件来创建链接并将其传递给setup(),作为“运行这些”的一些 kwarg 列表的一部分(如果存在这样的选项)。

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

foo 脚本期望来自src/ 的软件包之一被符号链接到其他地方的目录(例如,不仅仅是在PYTHONPATH 上)。有没有办法做到这一点?

【问题讨论】:

    标签: python symlink setuptools distribute


    【解决方案1】:

    我知道这篇文章已经有好几年了,但我想提供一个更新,说明在 setup.py 中可以进行后处理代码。长话短说,您必须覆盖 setuptools 的安装功能,但从那时起,您可以添加任何您想要的代码,例如复制 MANIFEST.in 拒绝复制的符号链接。摘自 Peter Lamut 的 solution

    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,
        },
        ...
    )
    

    【讨论】:

    • Hélio Guilherme 通知我,指向我的博客文章的链接已失效。我编辑了您的帖子以使链接再次活跃。我很高兴你发现它很有用,顺便说一句。
    【解决方案2】:

    扩展@pjeby 的答案,您还可以扩展安装命令以添加您自己的自定义安装后步骤。但是,这仅在从源代码安装(即运行 setup.py)时才有效,而 RPM 和 MSI 等其他安装程序将默默地忽略您的更改。

    编辑:在谷歌搜索后发现了这个,看来你应该尝试自己创建符号链接:http://docs.python.org/2/install/index.html#alternate-installation

    【讨论】:

      【解决方案3】:

      目前,只有特定于平台的包管理工具(例如 RPM、deb、win32 安装程序)能够运行安装后步骤:distutils、setuptools 等不直接支持这一点。 (除非允许您构建 RPM、Windows 安装程序等)

      因此,没有特定于平台的安装程序的最简单方法是创建您自己的安装后脚本,或将安装后选项添加到您现有的脚本中,并告诉用户运行它。否则,您必须使用 bdist_rpm 或其他 bdist 命令之一来为相应平台构建安装程序。

      【讨论】: