其他分享
首页 > 其他分享> > 如何使easy_install在setup.py中执行自定义命令?

如何使easy_install在setup.py中执行自定义命令?

作者:互联网

我希望我的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.

标签:easy-install,python,setuptools
来源: https://codeday.me/bug/20191008/1870567.html