安装模块和程序后,我需要运行一个简单的脚本。我很难找到有关如何执行此操作的直接文档。看起来我需要从 distutils.command.install 继承,覆盖一些方法并将这个对象添加到安装脚本中。虽然细节有点模糊,但对于这样一个简单的钩子来说似乎需要付出很多努力。有谁知道一个简单的方法来做到这一点?
问问题
13287 次
4 回答
38
我在 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), ...)
于 2009-08-24T09:27:59.653 回答
19
好的,我想通了。这个想法基本上是扩展 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},
...
)
希望这对其他人有帮助。
于 2009-08-24T09:31:05.217 回答
8
我无法让Joe Wreschnig的答案起作用,并调整了他的答案,类似于扩展 distutils文档。我想出了这段代码,它在我的机器上运行良好。
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})
注意:我没有编辑乔的答案,因为我不确定为什么他的答案在我的机器上不起作用。
于 2012-06-21T08:53:00.343 回答
2
当我在这里尝试接受的答案时出现错误(可能是因为我在这种特殊情况下使用的是 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
失败更冗长但也有错误:选项 --single-version-externally-managed 无法识别
已接受答案的变化
用setuptools替换来自distutils的导入为我解决了这个问题:
from setuptools import setup
from setuptools.command.install import install
于 2013-10-30T08:41:04.900 回答