当前位置: 首页 > 知识库问答 >
问题:

在安装后使用distutils/setupols执行Python脚本

潘秦斩
2023-03-14

我正在尝试向Python distutils添加一个安装后任务,如如何使用简单的安装后脚本扩展distutils?中所述?。该任务应该在已安装的lib目录中执行Python脚本。此脚本生成安装包所需的其他Python模块。

我的第一次尝试如下:

from distutils.core import setup
from distutils.command.install import install

class post_install(install):
    def run(self):
        install.run(self)
        from subprocess import call
        call(['python', 'scriptname.py'],
             cwd=self.install_lib + 'packagename')

setup(
 ...
 cmdclass={'install': post_install},
)

这种方法可行,但据我所知,有两个缺陷:

  1. 如果用户使用的Python解释器不是从PATH获取的解释器,则安装后脚本将使用另一个解释器执行,这可能会导致问题

如何改进我的解决方案?是否有推荐的方法/最佳实践?如果可能的话,我希望避免引入另一个依赖项。

共有2个答案

权烨磊
2023-03-14

我认为执行后期安装并保留需求的最简单方法是修饰对setup(…)的调用

from setup tools import setup


def _post_install(setup):
    def _post_actions():
        do_things()
    _post_actions()
    return setup

setup = _post_install(
    setup(
        name='NAME',
        install_requires=['...
    )
)

这将在声明set时运行set()。完成需求安装后,它将运行_post_install()函数,该函数将运行内部函数_post_actions()

江俊能
2023-03-14

解决这些缺陷的方法是:

>

但是,请注意,--dry run选项当前已损坏,并且无论如何都无法正常工作。

我最终得到了以下解决方案:

import os, sys
from distutils.core import setup
from distutils.command.install import install as _install


def _post_install(dir):
    from subprocess import call
    call([sys.executable, 'scriptname.py'],
         cwd=os.path.join(dir, 'packagename'))


class install(_install):
    def run(self):
        _install.run(self)
        self.execute(_post_install, (self.install_lib,),
                     msg="Running post install task")


setup(
    ...
    cmdclass={'install': install},
)

请注意,我为我的派生类使用类名安装,因为这是Pythonsetup.py--help-命令将使用的。

 类似资料:
  • 问题内容: 我正在尝试向Pythondistutils添加安装后任务,如如何使用简单的安装后脚本扩展distutils中所述。。该任务应该 在已安装的lib目录中 执行Python脚本。该脚本生成安装的软件包所需的其他Python模块。 我的第一次尝试如下: 这种方法有效,但是据我所知有两个缺陷: 如果用户使用的Python解释器不是从中选择的,则将使用 其他 解释器执行安装后脚本,这可能会引起问

  • 问题内容: 安装模块和程序后,我需要运行一个简单的脚本。我很难找到有关如何执行此操作的直接文档。看来我需要从distutils.command.install继承,重写一些方法,然后将此对象添加到安装脚本中。虽然细节有些模糊,但是对于这样一个简单的钩子似乎需要付出很多努力。有人知道这样做的简单方法吗? 问题答案: 我花了一天时间浏览distutils源码,以了解足够的知识来制作一堆自定义命令。它虽

  • 问题内容: 我希望能够将钩子添加到将在安装后运行的setup.py中(在easy_install’ing或执行python setup.py安装时)。 在我的项目PySmell中,我有一些针对Vim和Emacs的支持文件。当用户以通常的方式安装PySmell时,这些文件将复制到实际的鸡蛋中,并且用户必须将它们捞出并将它们放置在他的.vim或.emacs目录中。我想要的是询问用户,安装后,他想在哪里

  • 安装包时(通过使用python setup.py install),依赖项从python包索引(pypi.python.org)获取。但我的目标主机无法访问internet。我已将依赖项放在本地目录下,如下所示。 通过运行?

  • Python有一个令人困惑的工具历史,可以用来打包和描述项目:这些工具包括标准库中的,,和(也许更多)。似乎和被停用,取而代之的是,这留下了两个相互竞争的标准。 据我所知,提供了比多得多的选项(例如,声明依赖项、测试等),但是它没有包含在Python标准库中(尚未?)。 Python打包用户指南[1]现在建议: 使用定义项目并创建源发行版。 并解释道: 尽管您可以对许多项目使用纯,但它不支持定义对

  • 问题内容: 您可以简单地从python安装中删除目录,还是必须删除任何残留文件? 问题答案: 它取决于您传递给的选项以及系统/软件包中distutils配置文件的内容。我不相信会以这些方式在指定目录之外修改任何文件。 值得注意的是,distutils目前没有卸载命令。 还值得注意的是,删除程序包/鸡蛋可能会导致依赖关系问题,例如尝试减轻此类问题的实用程序。