【问题标题】:Using setuptools in your package's setup.py -- How do you conditionally install a script?在你的包的 setup.py 中使用 setuptools -- 你如何有条件地安装一个脚本?
【发布时间】:2023-11-18 22:07:01
【问题描述】:

如何配置 setup.py 以便它不会尝试覆盖已经存在的脚本?或者,如果编写脚本失败,至少完成包安装的其余部分。我正在为my setup.py 使用 setuptools。 setup.py 的相关部分是这样的:

entry_points = {
    'console_scripts' : [
        'green = green:main',  # <-- The one I have problems with
        'green%d = green:main' % sys.version_info[:1],     # green2 or green3
        'green-%d.%d = green:main' % sys.version_info[:2], # green-3.4 etc.
        ],
},

my setup.py 既有版本控制的脚本(python 的版本包含在脚本名称中)也有非版本控制的脚本。在 OS X 上,我使用 2.7 的系统 python,它需要超级用户权限才能运行 pip (sudo pip ...),这会导致脚本以 root 所有权安装在 /usr/local/bin 下。然后,当我尝试在通过 homebrew 安装的具有用户权限的 python 3.4 下安装时,它会尝试(并且失败)覆盖/usr/local/bin 中的未版本控制脚本。我不介意它不能覆盖脚本文件,我确实介意 pip 安装失败并使安装一半的软件包处于奇怪、时髦的状态。

我希望能够指示 setup.py 如果脚本已经被其他东西安装,则不要尝试安装它,或者至少忽略错误并继续安装其余部分(如果没有)没有权限覆盖脚本。

【问题讨论】:

    标签: python setuptools pypi


    【解决方案1】:

    我不知道,如果标准 setup 函数行为支持您的要求。

    但我确信,可以做到以下几点:

    只问setup 什么是真正可能的

    1. 在您致电setup 之前,请检查该脚本是否已存在并且您愿意重新安装或跳过它。您在 Python 脚本中,因此您手头有完整的 Python 功能,可以使用它来调查情况并做出决定。

    2. 在调用setup 时,以这样的方式构造entry_points 的值,它可以满足您的需要(安装或不安装脚本)。

    不管怎样,这个有难度,你需要自己分析,如果要安装的脚本已经存在,在哪里,检查,是否更新等等。

    尝试向setup询问您想要什么,如果失败,请少问

    由于setup是一个函数,你可以把它放到tryexcept,如果你知道,你可以解决没有第一个脚本要求安装的问题,第二次尝试可能会这样。

    【讨论】:

    • 因此,要使其以跨平台方式工作,我需要能够调用 setuptools 以找出脚本将在此系统上安装的位置(路径不同在所有系统上)。知道我在哪里可以找到那条路吗?我搜索了 setuptools API 文档,发现的只有 this useless sectionthe pkg_resources documentation 看起来很有希望,但我没有在任何地方找到它。有什么想法吗?
    • @Nathan 不知道,它安装在哪里。我要么深入 setuptools 代码来检查这一点,要么使用 try - 除了 setup 调用。但是这些天我没有时间进行更深入的测试。
    最近更新 更多