当前位置: 首页 > 面试题库 >

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

吴峰
2023-03-14
问题内容

我正在尝试向Pythondistutils添加安装后任务,如如何使用简单的安装后脚本扩展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. 这对于防止空运行等并不安全,我可以通过将其包装在函数中并使用来进行补救distutils.cmd.Command.execute

我该如何改善解决方案?有推荐的方法/最佳做法吗?如果可能,我想避免引入其他依赖项。


问题答案:

解决这些缺陷的方法是:

  1. 获取setup.py从执行的Python解释器的完整路径sys.executable
  2. 继承自的类distutils.cmd.Command(例如distutils.command.install.install我们在此处使用的类)实现该execute方法,该方法以“安全方式”(即尊重空运行标志)执行给定功能。

但是请注意,该--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},
)

请注意,我将类名install用于派生类,因为这python setup.py --help-commands将使用。



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

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

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

  • 问题内容: 我需要执行一个shell脚本。难得的是我想这样做 我不希望它等待命令完成,我希望它在后台进程中运行。我不想要另一个php线程,因为它将超时,该命令最多可能需要3个小时才能完成。 问题答案: 您需要重定向命令的输出。 如果使用此功能启动程序,则要使其在后台继续运行,必须将程序的输出重定向到文件或其他输出流。否则,PHP会挂起,直到程序执行结束。 http://php.net/manual

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

  • 我正在使用setuptools创建一个快速设置。用于为用户安装依赖项的py脚本。该包只需要numpy和matlibplot。因此,代码如下所示: 运行sudopython安装程序。py install为我提供了以下信息: 我对setuptools的理解可能是错误的,因为我希望它能够从PyPI更新/安装可用的依赖项。有人能提供更多关于这方面的见解吗?