是否可以将安装后 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/