python - 使用 Python setuptools 安装后脚本

标签 python setuptools software-distribution setup.py pypi

是否可以将安装后 Python 脚本文件指定为 setuptools setup.py 文件的一部分,以便用户可以运行命令:

python setup.py install

在本地项目文件存档上,或

pip install <name>

对于 PyPI 项目,脚本将在标准 setuptools 安装完成时运行?我希望执行可以在单个 Python 脚本文件中编码的安装后任务(例如,向用户提供自定义安装后消息,从不同的远程源存储库中提取其他数据文件)。

我遇到了this SO answer from several years ago这解决了该主题,听起来当时的共识是您需要创建一个安装子命令。如果情况仍然如此,是否可以提供一个示例说明如何执行此操作,以便用户无需输入第二个命令来运行脚本?

最佳答案

注意:以下解决方案仅在安装源代码分发 zip 或 tarball 或从源代码树以可编辑模式安装时有效。从二进制轮 (.whl) 安装时,它将工作


这个解决方案更透明:

您将对 setup.py 进行一些添加,并且不需要额外的文件。

您还需要考虑两种不同的后期安装;一种用于开发/可编辑模式,另一种用于安装模式。

将这两个包含您的安装后脚本的类添加到setup.py:

from setuptools import setup
from setuptools.command.develop import develop
from setuptools.command.install import install


class PostDevelopCommand(develop):
    """Post-installation for development mode."""
    def run(self):
        develop.run(self)
        # PUT YOUR POST-INSTALL SCRIPT HERE or CALL A FUNCTION

class PostInstallCommand(install):
    """Post-installation for installation mode."""
    def run(self):
        install.run(self)
        # PUT YOUR POST-INSTALL SCRIPT HERE or CALL A FUNCTION

并在 setup.py 中将 cmdclass 参数插入到 setup() 函数中:

setup(
    ...

    cmdclass={
        'develop': PostDevelopCommand,
        'install': PostInstallCommand,
    },

    ...
)

您甚至可以在安装过程中调用 shell 命令,例如在此示例中进行安装前准备:

from setuptools import setup
from setuptools.command.develop import develop
from setuptools.command.install import install
from subprocess import check_call


class PreDevelopCommand(develop):
    """Pre-installation for development mode."""
    def run(self):
        check_call("apt-get install this-package".split())
        develop.run(self)

class PreInstallCommand(install):
    """Pre-installation for installation mode."""
    def run(self):
        check_call("apt-get install this-package".split())
        install.run(self)


setup(
    ...

附注setuptools 上没有任何预安装入口点。阅读 this discussion如果你想知道为什么没有。

关于python - 使用 Python setuptools 安装后脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20288711/

相关文章:

python - 计算每个月的支出金额,这取决于另一个列值 ID

python - 如何通过允许预发布来指定 Python 要求?

linux - 制作 Linux 发行版有多容易?

python - python包的适当权限

python - 在python中的类中调用静态方法

python - 根据值从现有字典生成所有可能的字典

python - Blender Python API 添加属性到对象

python - 如何使用 setuptools 和 setup.py 从包中排除单个文件

python - 使用 setuptools (pip) 时如何打印警告和错误

blackberry - 我可以通过网络服务器 (OTA) 分发我的 BlackBerry 10 WebWorks 应用程序吗?