如何检查应该使用哪个 python 版本

How to check which python version is supposed to use

假设我有一堆 python 脚本全部以 #!/usr/bin/env python 开头或什么都没有(根本没有 shebang)。其中一些脚本需要 python 2.7(或任何 2.x 版本),其中一些需要 python 3.x,其中一些可以 运行在两者上(它们自己检查 python 版本)。

我的系统有两个 python 版本:python2python3。一般 python 程序只是一个符号链接。

由于此 python 符号链接可以更改,我想编辑脚本中的 shebang 以指定此脚本是否应使用 python2python3。是否有任何 possibility/program/script 到 'parse' 的 python 脚本并确定它是否应该通过 python2python3 获得 运行?

首先,将 python2python3 放在 #! 行。在 *nix 上,当您尝试直接 'execute' 文件时,OS 应该读取该行并且 select 应该读取正确的二进制文件。在 Windows 上,省略 'usr/bin/env 并使用 py.exe 到 运行 文件,该文件现在随 PSF CPython 安装程序一起安装。示例:tem.py 包含

#! python2
import sys; print(sys.version)

在命令行

C:\Users\Terry>py /programs/python34/tem.py
2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)]

如果我在文件中将 2 更改为 3,输出将更改为 3.4.2。

PEP 394 - The "python" Command on Unix-Like Systems:

  • ... python should be used in the shebang line only for scripts that are source compatible with both Python 2 and 3.

  • in preparation for an eventual change in the default version of Python, Python 2 only scripts should either be updated to be source compatible with Python 3 or else to use python2 in the shebang line.

一般来说,Python 2 和 3 都可以 运行 同一个脚本。这意味着(至少对于某些脚本而言)您必须阅读源代码并自行决定要做什么Python 应该使用版本。

Is there any possibility/program/script to 'parse' a python script and determine if it should get run by python2 or python3?

您可以尝试使用 python2python3 二进制文件 编译 您的脚本,尝试:

$ python -mcompileall -h

如果只有 python3 二进制文件可以编译脚本,您可以将 python3 添加到 shebang 中。

Modernize, Futurize, Pylint packages 还可以帮助自动查找仅 python2、仅 python3 的脚本。

lib2to3 允许您检测 python2python3 标记,例如源中存在 print 语句(Python 2 标记)或来源(Python 3 标记)中存在 yield from,但它可能级别太低。