有没有一种标准方法来确保 python 脚本将由 python2 而不是 python3 解释?在我的发行版中,我可以使用 #!/usr/bin/env python2 作为 shebang,但似乎并非所有发行版都提供“python2”。我可以明确调用 python 的特定版本(例如 2.6),但这会排除没有该版本的人。
在我看来,当发行版开始将 python3 作为默认的 python 解释器时,这将成为一个越来越大的问题。
有没有一种标准方法来确保 python 脚本将由 python2 而不是 python3 解释?在我的发行版中,我可以使用 #!/usr/bin/env python2 作为 shebang,但似乎并非所有发行版都提供“python2”。我可以明确调用 python 的特定版本(例如 2.6),但这会排除没有该版本的人。
在我看来,当发行版开始将 python3 作为默认的 python 解释器时,这将成为一个越来越大的问题。
http://docs.python.org/library/sys.html#sys.version_info
使用 sys 模块,您可以确定正在运行的 python 版本并引发异常或退出或任何您喜欢的。
更新:
您可以使用它来调用适当的解释器。例如,设置一个为您进行检查的小脚本,并在 shbang 中使用它。它会检查正在运行的 python 版本,如果不是你想要的,就会寻找你想要的。然后它会在那个版本的 python 中运行脚本(或者如果没有发现任何好的东西就会失败)。
在一个非常长的过渡时间段内,这是一个有点混乱的问题。不幸的是,没有万无一失的跨平台方法来保证正在调用哪个 Python 版本,除了让 Python 脚本本身在启动后进行检查。许多(如果不是大多数)发布 Python 3 的发行版都确保通用python
命令默认别名为最新的 Python 2 版本,而python3
别名为最新的 Python 3。不应该鼓励那些不这样做的发行版。但是不能保证用户不会覆盖它。我认为在可预见的未来可用的最佳实践是让打包者、分销商和用户假设python
参考 Python 2,并在必要时在脚本中构建运行时检查。
使用sys.version_info
您可以对它进行简单的价值测试。例如,如果您只想支持 2.6 或更低版本:
import sys
if sys.version_info > (2,6):
sys.exit("Sorry, only we only support up to Python 2.6!")
情况不太一样,但我工作的公司有一个可以运行 Python 脚本的应用程序(在它的许多功能中)。在各种平台上涉及 Python 安装的众多支持问题之后,我们决定只在应用程序中安装我们自己的 Python 解释器。这样我们就可以准确地知道它的安装位置和版本。对于您的需求,这种方法可能过于繁重(Python 包仅占我们应用程序的 10% 左右),但它确实有效。
取决于你如何分发它,我猜。
如果您使用普通setup.py
文件来管理您的发行版,如果用户试图在 Python 3 中安装它,请让它爆炸。
安装后,由(比如说)setuptools 创建的控制台脚本的 shebang 可能会链接到用于安装它的特定解释器。
如果您正在为安装做一些奇怪的事情,您可以在您使用的任何安装脚本中查找 python 解释器并存储一个选项。您可能首先检查所谓的“python”是否是 2.x。如果没有,请检查“python2.7”、“python2.6”等以查看可用的内容。
据我了解,不同的发行版将位于您驱动器的不同位置。以下是我想到的一些建议——
这个应该做...
您可以使用自动工具来选择 Python 2 解释器。 这是如何做到这一点的。保证正确的shebang可能很难优雅地做到。这是一种方法。简单地拥有一个轻量级的 Bash 包装器脚本可能更容易,wrapper.sh.in
它看起来像:
#!/bin/bash
PYTHON2="@PYTHON@" #That first link enables this autotool variable
"$PYTHON2" "$@" #Call the desired Python 2 script with its arguments
调用wrapper.sh
(在 a 之后./configure
)像:
./wrapper.sh my_python2_script.py --an_option an_argument
我相信这会满足您的要求,即测试小于 3.x 的非特定 Python 版本(只要它不包含from __future__ import print_function
语句)。
try:
py3 = eval('print')
except SyntaxError:
py3 = False
if py3: exit('requires Python 2')
...
它通过测试查看是否print
是内置函数而不是语句来工作,就像在 Python3 中一样。当它不是函数时,该eval()
函数将引发异常,这意味着代码在 Python 3.0 之前的解释器上运行,并带有上述警告。