什么时候可以在 setup.py 脚本中使用 python 的后续次要版本更新中的功能?
When is it acceptable to use features from a later minor version update of python in a setup.py script?
原题:
我们应该在 setup.py 中使用 python 3.6 功能吗?
我为依赖于 python 3.6 的私有库安装程序创建了一个 setup.py。我试图让这个文件对任何试图在 python 之前的版本上安装它的人来说更友好一点,但我意识到我的想法有一个重大缺陷。
我在 setup.py 中使用 f-strings, 仅适用于 >=3.6!
任何试图在 python 的先前版本中 运行 setup.py 的人甚至都不会到达检查解释器版本的第一行代码。因此,这让我开始思考创建 setup.py 文件的准则,以及可能存在哪些其他语法限制会阻止 setup.py 在多个环境中正确 运行ning。
#!/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 中使用它们?两个小版本?三?下一个主要版本?
首先,让我们总结一下评论中的重要讨论:您的 setup.py
包含 f-string 无论如何都不会被调用,除非客户端的 pip 版本非常旧。早于在 pip 9.0.0 (2016) (changelog). Note that all direct invocations of setup.py
are effectively deprecated 中引入对 python_requires
元数据的支持,如果 pip
能够找到 wheel 分布,那么就不会有 setup.py
完全执行,该文件甚至不包含在轮子中。
现在回答实际问题:随时使用更新的语言功能是可以接受的,甚至 立即,只要您的包元数据传达所需的最低 Python 版本这是支持的。
您已经在问题的示例代码中通过在 python_requires
:
上提供下限来执行此操作
setup(
...
python_requires=">=3.6",
...
)
构建的发行版将有元数据关联的广告需要至少 3.6 的 Python 版本,这意味着 Python 早于 3.6 的运行时将不会首先尝试安装包.事实上,在那种情况下,pip
甚至不会尝试 下载 它。
Python 版本要求将在 project landing page 上显示如下:
而实际的发布文件 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)
原题:
我们应该在 setup.py 中使用 python 3.6 功能吗?
我为依赖于 python 3.6 的私有库安装程序创建了一个 setup.py。我试图让这个文件对任何试图在 python 之前的版本上安装它的人来说更友好一点,但我意识到我的想法有一个重大缺陷。
我在 setup.py 中使用 f-strings, 仅适用于 >=3.6!
任何试图在 python 的先前版本中 运行 setup.py 的人甚至都不会到达检查解释器版本的第一行代码。因此,这让我开始思考创建 setup.py 文件的准则,以及可能存在哪些其他语法限制会阻止 setup.py 在多个环境中正确 运行ning。
#!/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 中使用它们?两个小版本?三?下一个主要版本?
首先,让我们总结一下评论中的重要讨论:您的 setup.py
包含 f-string 无论如何都不会被调用,除非客户端的 pip 版本非常旧。早于在 pip 9.0.0 (2016) (changelog). Note that all direct invocations of setup.py
are effectively deprecated 中引入对 python_requires
元数据的支持,如果 pip
能够找到 wheel 分布,那么就不会有 setup.py
完全执行,该文件甚至不包含在轮子中。
现在回答实际问题:随时使用更新的语言功能是可以接受的,甚至 立即,只要您的包元数据传达所需的最低 Python 版本这是支持的。
您已经在问题的示例代码中通过在 python_requires
:
setup(
...
python_requires=">=3.6",
...
)
构建的发行版将有元数据关联的广告需要至少 3.6 的 Python 版本,这意味着 Python 早于 3.6 的运行时将不会首先尝试安装包.事实上,在那种情况下,pip
甚至不会尝试 下载 它。
Python 版本要求将在 project landing page 上显示如下:
而实际的发布文件 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)