如何让easy_install执行setup.py中的自定义命令?
我希望我的setup.py文件除了安装Python包之外,还能执行一些自定义操作,比如安装一个init.d脚本、创建目录和文件等等。我知道我可以自定义distutils或setuptools的类来实现我的操作。问题是,当我进入包的目录并运行“python setup.py install”时,一切都能正常工作,但当我使用“easy_install mypackage.tar.gz”时,我的自定义类似乎没有被执行。以下是我的setup.py文件(在同一目录下创建一个空的myfoobar.py文件来测试):
import setuptools
from setuptools.command import install as _install
class install(_install.install):
def initialize_options(self):
_install.install.initialize_options(self)
def finalize_options(self):
_install.install.finalize_options(self)
def run(self):
# Why is this never executed when tarball installed with easy_install?
# It does work with: python setup.py install
import pdb;pdb.set_trace()
_install.install.run(self)
setuptools.setup(
name = 'myfoobar',
version = '0.1',
platforms = ['any'],
description = 'Test package',
author = 'Someone',
py_modules = ['myfoobar'],
cmdclass = {'install': install},
)
即使我从distutils导入“setup”和“install”,情况也是一样。我想知道有什么办法可以让easy_install执行我的自定义类?
为了澄清,我不想使用任何额外的工具,比如Buildout或Paver。
2 个回答
Paver 是一个工具,它让你可以在使用 setuptools 的基础上,进行更高级的操作。简单来说,它允许你编写自己的任务,扩展通常的 setup.py 文件,并且提供了一种简单的方法来搭建 Paver 的工作环境。
这件事是做不到的。Enthought 有一个特别版本的 setuptools,它支持这个功能,但除此之外,这个问题在 bug 跟踪系统里被列为一个愿望清单项,自从六月份以来一直在讨论。
不过,有一些方法可以绕过这个限制,你可以考虑一下。一个方法是让你最重要的模块,也就是在使用你的包时总是第一个被导入的模块,在第一次调用时执行一些安装后的操作。然后你需要自己清理一下,并考虑到一种情况:如果是管理员安装的包,而第一个使用这个包的用户不是管理员,那就可能无法写入库。
在最糟糕的情况下,这就意味着每个使用这个包的用户都需要创建一个 ~/.mypackage 目录,并且每个新用户都要重新执行一次安装后的操作。每次导入这个模块时,它会检查 ~/.mypackage 是否存在。如果不存在,就执行安装后的操作并创建这个目录。如果存在,就跳过安装后的操作。