如何编写能够正确要求最小python版本的Python代码?

sor*_*rin 53 python

我想看看是否有任何方法需要一个最小的python版本.

由于新的异常处理(as关键字),我有几个需要Python 2.6的python模块.

它看起来即使我在我的脚本开头检查python版本,代码也不会运行,因为解释器将在模块内部失败,抛出一个丑陋的系统错误而不是告诉用户使用更新的python.

Wal*_*ndt 37

您不应该在脚本本身内使用任何Python 2.6功能.此外,在导入需要新Python版本的任何模块之前,必须进行版本检查.

例如,像这样开始你的脚本:

#!/usr/bin/env python
import sys

if sys.version_info[0] != 2 or sys.version_info[1] < 6:
    print("This script requires Python version 2.6")
    sys.exit(1)

# rest of script, including real initial imports, here
Run Code Online (Sandbox Code Playgroud)

  • 即使在尝试使用_3.x_运行脚本时,也可以优雅地退出,但除非_entire_脚本恰好是be_syntactically_有效3.x,否则这将无效.`print`不是打印错误消息的好选择,因为它默认打印到_stdout_; 简单的解决方案是使用`sys.exit("这个脚本需要Python 2.x,> = 2.6"`)(如在接受的答案中),它打印到_stderr_并且也以代码1退出.(顺便说一下:在Windows上,当使用`pythonw.exe`调用时,你必须做更多工作才能显示错误.) (5认同)
  • +1.我在你的'print`中添加了一些括号,因为Tim指出它会在Python 3中出现`SyntaxError`失败(这很复杂!)我认为这是最正确的方法 - 我的方法更快但是有点黑客. (2认同)

Ark*_*ady 28

您可以利用Python在比较元组时做正确的事实:

#!/usr/bin/python
import sys
MIN_PYTHON = (2, 6)
if sys.version_info < MIN_PYTHON:
    sys.exit("Python %s.%s or later is required.\n" % MIN_PYTHON)
Run Code Online (Sandbox Code Playgroud)


Sco*_*ths 18

我发现这样做的最简单的方法(也参见这个问题)只是添加一行,如:

b'You need Python 2.6 or later.'
Run Code Online (Sandbox Code Playgroud)

在文件的开头.这利用了2.6中引入了字节文字的事实,因此任何早期版本都将SyntaxError使用您编写的任何消息作为堆栈跟踪引发.

如果你需要Python 2.7,那么:

{'You need Python 2.7 or later.'}
Run Code Online (Sandbox Code Playgroud)

这是2.6中的语法错误.

对于Python 2.5,这应该工作:

'You need Python 2.5' if 'you want this to run or' else 'this line fails!'
Run Code Online (Sandbox Code Playgroud)

这是2.4中的语法错误.

  • 虽然这很聪明,但却非常违反"明确与隐含"规则.根据这样的副作用,我感觉不对.从这里的很多问题来看,许多最终用户从不读取堆栈跟踪,只看到"哦,语法错误!程序必须被破坏!" (24认同)

Pio*_*ost 16

从版本9.0.0开始,pip 支持 分发元数据中的Requires-Python字段,该字段可以由版本24-2-0开始的setuptools编写.此功能可通过python_requires关键字参数来实现setup.

示例(在setup.py中):

setup(
...
   python_requires='>=2.5,<2.7',
...

)
Run Code Online (Sandbox Code Playgroud)

要利用此功能,必须首先打包项目/脚本(如果尚未完成).这在典型情况下非常简单,应该尽可能地完成,因为它允许用户轻松安装,使用和卸载给定的项目/脚本.有关详细信息,请参阅Python Packaging用户指南.


sor*_*rin 10

import sys
if sys.hexversion < 0x02060000:
    sys.exit("Python 2.6 or newer is required to run this program.")

import module_requiring_26
Run Code Online (Sandbox Code Playgroud)

关于这一点的很酷的部分是它可以包含在__init__文件或模块中.

  • 这是 Walter Mundt 答案的劣质版本,该答案在此之前已经发布。 (3认同)
  • 你不想防止在Python 3下运行脚本吗? (2认同)
  • 比 @Arkady 的“sys.version_info &lt; (2, 6)” 不太直观且可读性较差 (2认同)

小智 7

我曾经有一个更复杂的方法来支持Python2和Python3,但我不再尝试支持Python2,所以现在我只使用:

import sys
MIN_PYTHON = (3, 7)
assert sys.version_info >= MIN_PYTHON, f"requires Python {'.'.join([str(n) for n in MIN_PYTHON])} or newer"
Run Code Online (Sandbox Code Playgroud)

如果版本检查失败,您会得到类似以下内容的回溯:

AssertionError: requires Python 3.7 or newer
Run Code Online (Sandbox Code Playgroud)

在底部。

  • 旧版本不理解 [f-strings](https://docs.python.org/3/tutorial/inputoutput.html#),所以我更喜欢 [print-f](https://docs.python. org/3/library/stdtypes.html#printf-style-string-formatting) 格式“需要 Python %s.%s 或更新版本。” %MIN_PYTHON`。 (7认同)