我需要在安装模块和程序后运行一个简单的脚本。 我在找到如何做到这一点的直接文档方面遇到了一些麻烦。看起来我需要从distutils.command.install继承,重写一些方法并将此对象添加到安装脚本。虽然细节有点模糊,但对于这样一个简单的钩子来说似乎需要付出很多努力。有谁知道一个简单的方法来做到这一点?
答案 0 :(得分:33)
我通过distutils源挖了一天,足够了解它来制作一堆自定义命令。它不漂亮,但确实有效。
import distutils.core
from distutils.command.install import install
...
class my_install(install):
def run(self):
install.run(self)
# Custom stuff here
# distutils.command.install actually has some nice helper methods
# and interfaces. I strongly suggest reading the docstrings.
...
distutils.core.setup(..., cmdclass=dict(install=my_install), ...)
答案 1 :(得分:16)
好的,我明白了。这个想法基本上是扩展其中一个distutils命令并覆盖run方法。要告诉distutils使用新类,您可以使用cmdclass变量。
from distutils.core import setup
from distutils.command.install_data import install_data
class post_install(install_data):
def run(self):
# Call parent
install_data.run(self)
# Execute commands
print "Running"
setup(name="example",
cmdclass={"install_data": post_install},
...
)
希望这会帮助别人。
答案 2 :(得分:7)
我无法让Joe Wreschnig的答案工作并调整他的答案类似于扩展的distutils documentation。我想出了这个在我的机器上工作正常的代码。
from distutils import core
from distutils.command.install import install
...
class my_install(install):
def run(self):
install.run(self)
# Custom stuff here
# distutils.command.install actually has some nice helper methods
# and interfaces. I strongly suggest reading the docstrings.
...
distutils.core.setup(..., cmdclass={'install': my_install})
注意:我没有编辑Joe的答案,因为我不确定为什么他的答案不适用于我的机器。
答案 3 :(得分:0)
当我在这里尝试接受的答案时出现错误(可能是因为我在这种特殊情况下使用的是Python 2.6,不确定)。 “setup.py install”和“pip install”都发生了这种情况:
sudo python setup.py install
因错误而失败:setup.cfg中的错误:命令'my_install'没有这样的选项'single_version_externally_managed'
和
sudo pip install . -U
更加冗长,但也出现错误:选项 - 单个版本 - 外部管理无法识别
用 setuptools 替换 distutils 的导入为我解决了这个问题:
from setuptools import setup
from setuptools.command.install import install