我希望我的setup.py除了安装Python包之外还做一些自定义操作(比如安装init.d脚本,创建目录和文件等).我知道我可以自定义distutils / setuptools类来做我自己的操作.我遇到的问题是当我cd到包目录并执行“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.
解决方法:
它无法完成. Enthought有一个自定义版本的setuptools支持这个,但是它在bug跟踪器中作为wishlist项目,自6月以来一直在讨论.
但是,有一些方法可以欺骗系统,您可能会考虑它们.一种方法是使用最重要的模块,即在使用软件包时始终首先导入的模块,在第一次调用时执行安装后操作.然后你必须自己清理,并考虑你不能写入库的情况,因为管理员安装了包,第一个用户是管理员以外的人.
在最坏的情况下,这将涉及为使用该包的用户创建〜/ .mypackage目录,并为每个新用户重新运行一次postinstall.每次导入模块时,它都会检查是否存在〜/ .mypackage.如果不存在,则运行postinstall并创建它.如果它在那里,它会跳过postinstall.