python - 什么时候可以在 setup.py 脚本中使用 python 后续次要版本更新中的功能?

标签 python python-3.x python-3.6 setuptools f-string

原始问题标题:

我们应该在 setup.py 中使用 python 3.6 功能吗?

我已经为依赖于 python 3.6 的私有(private)库安装程序创建了 setup.py。我试图让这个文件对于任何试图在之前的 python 版本上安装它的人来说更加友好,并意识到我的想法有一个重大缺陷。

我正在使用f-strings在 setup.py 中,仅适用于 >=3.6!

任何尝试在以前版本的 python 中运行 setup.py 的人甚至都无法到达检查解释器版本的第一行代码。因此,这让我思考创建 setup.py 文件的准则,以及可能存在哪些其他语法限制,这些限制会阻止 setup.py 在多个环境中正常运行。

#!/usr/bin/env python3

"""
PIP Install script for XXXXXX packages
"""
import sys
if sys.version_info < (3,6):
    sys.exit('Sorry, Python < 3.6 is not supported')

from setuptools import setup

NAME = 'abcutil'
AUTHOR = 'XXXXXXXXXX'

CLASSIFIERS = """\
Development Status :: 5 - Production/Stable
Intended Audience :: Developers
Programming Language :: Python
Programming Language :: Python :: 3
Topic :: Software Development
Operating System :: Microsoft :: Windows
Operating System :: Unix
Operating System :: MacOS
"""

MAJOR               = 1
MINOR               = 1
MICRO               = 0
ISRELEASED          = False
VERSION             = f'{MAJOR}.{MINOR}.{MICRO}'

setup(name = NAME,
      maintainer = AUTHOR,
      version=VERSION,
      maintainer_email = 'XXXXXXX',
      description='XXXXXXX utility packages',
      author = AUTHOR,
      download_url = 'https://gitlabXXXXXXXX/XXXXXXX',
      license = 'BSD',
      classifiers=[_f for _f in CLASSIFIERS.split('\n') if _f],
      python_requires=">=3.6",
      packages=[NAME, f"{NAME}.selenium", f"{NAME}.regression_helpers"],
      install_requires = ['selenium==3.9', 'requests>=2.18.4', 'python-dateutil', 'pytz'],
      dependency_links=['']
      )

运行上面的命令会给你这个:

$ python setup.py
  File "setup.py", line 30
    VERSION             = f'{MAJOR}.{MINOR}.{MICRO}'
                                                   ^
SyntaxError: invalid syntax

我的问题是

当 setup.py 使用仅限于较新版本的解释器功能时,建议使用什么?


编辑:

3.8.2 现已发布,它让我再次思考这个问题。所以我重新表述了这个问题。

什么时候可以在 setup.py 脚本中使用 python 后续次要版本更新的功能?

3.6 中添加了 F 弦。什么时候可以开始在 setup.py 中使用它们?两个小版本?三?下一个主要版本?

最佳答案

首先,让我们总结一下评论中涉及的重要讨论:包含 f 字符串的 setup.py 无论如何都不会被调用,除非客户端的 pip 版本非常旧。早于引入对 python_requires 元数据的支持,该支持位于 pip 9.0.0 (2016) (changelog) 。请注意all direct invocations of setup.py are effectively deprecated ,如果pip能够找到一个wheel分布,那么根本不会执行setup.py,该文件甚至不包含在wheel中。

现在回答实际问题:只要您的包元数据传达受支持的最低所需 Python 版本,就可以随时使用更新的语言功能,甚至立即

您已经在问题的示例代码中通过提供 python_requires 的下限来执行此操作:

setup(
    ...
    python_requires=">=3.6",
    ...
)

构建的发行版将具有与广告相关的元数据,表明需要至少 3.6 的 Python 版本,这意味着早于 3.6 的 Python 运行时不会首先尝试安装该包。事实上,在这种情况下,pip 甚至不会尝试下载它。

Python 版本要求将显示在 project landing page 上像这样:

python requires render

实际的发布文件 abcutil-1.1.0.tar.gz ,对于所有实际目的来说,对于较低的 Python 版本来说都是“不可见的”,例如:

$ python2 -m pip install --index-url=https://test.pypi.org/simple abcutil
Looking in indexes: https://test.pypi.org/simple
ERROR: Could not find a version that satisfies the requirement abcutil (from versions: none)
ERROR: No matching distribution found for abcutil

您可以启用 pip 的详细日志记录来见证包查找器看到并有意跳过此分发:

$ python2 -m pip install -i https://test.pypi.org/simple abcutil -v |& grep abcutil-1
  Link requires a different Python (2.7.18 not in: u'>=3.6'): https://test-files.pythonhosted.org/packages/89/8a/45a45b35deae088b184b776fb11392e13023ee566d8ff9484dba49a310cc/abcutil-1.1.0.tar.gz#sha256=72aeec98ff91fadaf49eea1f0c3fd9fa45dfb304bbbf4e0b79a04fcbcd76072f (from https://test.pypi.org/simple/abcutil/) (requires-python:>=3.6)

关于python - 什么时候可以在 setup.py 脚本中使用 python 后续次要版本更新中的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52540693/

相关文章:

python - 谁能向我解释一下Python中的两级字典是什么

python - 为什么我不能在迭代另一个字典时修改一个字典(获取更改大小错误)?

python - 如何从套装中获得一些元素?

python - 读取 html 文件并将其显示在 tkinter 窗口中

django - 我可以使用不同的端口运行 3 个 uwsgi 服务吗

python - 将 BoxLayout 与 GridLayout 内的按钮居中

python - 如何使用 or-tools 在我们的 MIP 问题中设置类似 y = max(x1,x2,x3) 的等式约束?

python - 如果目标文件夹中已存在文件,如何替换文件?

python - 如何从文本文件中的 jpeg 图像文件列表中打开图像 - 变量形成