22

有没有一种标准方法来确保 python 脚本将由 python2 而不是 python3 解释?在我的发行版中,我可以使用 #!/usr/bin/env python2 作为 shebang,但似乎并非所有发行版都提供“python2”。我可以明确调用 python 的特定版本(例如 2.6),但这会排除没有该版本的人。

在我看来,当发行版开始将 python3 作为默认的 python 解释器时,这将成为一个越来越大的问题。

4

8 回答 8

11

http://docs.python.org/library/sys.html#sys.version_info

使用 sys 模块,您可以确定正在运行的 python 版本并引发异常或退出或任何您喜欢的。

更新:

您可以使用它来调用适当的解释器。例如,设置一个为您进行检查的小脚本,并在 shbang 中使用它。它会检查正在运行的 python 版本,如果不是你想要的,就会寻找你想要的。然后它会在那个版本的 python 中运行脚本(或者如果没有发现任何好的东西就会失败)。

于 2010-08-27T17:42:36.647 回答
8

在一个非常长的过渡时间段内,这是一个有点混乱的问题。不幸的是,没有万无一失的跨平台方法来保证正在调用哪个 Python 版本,除了让 Python 脚本本身在启动后进行检查。许多(如果不是大多数)发布 Python 3 的发行版都确保通用python命令默认别名为最新的 Python 2 版本,而python3别名为最新的 Python 3。不应该鼓励那些不这样做的发行版。但是不能保证用户不会覆盖它。我认为在可预见的未来可用的最佳实践是让打包者、分销商和用户假设python参考 Python 2,并在必要时在脚本中构建运行时检查。

于 2010-08-27T20:00:59.923 回答
7

使用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!")
于 2010-08-27T18:37:56.583 回答
2

情况不太一样,但我工作的公司有一个可以运行 Python 脚本的应用程序(在它的许多功能中)。在各种平台上涉及 Python 安装的众多支持问题之后,我们决定只在应用程序中安装我们自己的 Python 解释器。这样我们就可以准确地知道它的安装位置和版本。对于您的需求,这种方法可能过于繁重(Python 包仅占我们应用程序的 10% 左右),但它确实有效。

于 2010-08-27T20:11:25.293 回答
2

取决于你如何分发它,我猜。

如果您使用普通setup.py文件来管理您的发行版,如果用户试图在 Python 3 中安装它,请让它爆炸。

安装后,由(比如说)setuptools 创建的控制台脚本的 shebang 可能会链接到用于安装它的特定解释器。

如果您正在为安装做一些奇怪的事情,您可以在您使用的任何安装脚本中查找 python 解释器并存储一个选项。您可能首先检查所谓的“python”是否是 2.x。如果没有,请检查“python2.7”、“python2.6”等以查看可用的内容。

于 2010-08-27T20:22:06.523 回答
0

据我了解,不同的发行版将位于您驱动器的不同位置。以下是我想到的一些建议——

  1. 您可以使用 UNIX 别名来创建指向不同发行版的快捷方式。例如:别名 py2="/usr/bin/python2.X"。因此,当您运行脚本时,您可以使用 py2 xx.py
  2. 或者其他方式可能是修改您的 PYTHON_PATH 环境变量。
  3. 或者,如果我没记错的话,sys 模块中有一个规定可以获取当前的 python 版本号。你可以得到它并适当地处理。

这个应该做...

于 2010-08-27T17:43:29.950 回答
0

您可以使用自动工具来选择 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
于 2013-10-04T18:34:39.500 回答
-1

我相信这会满足您的要求,即测试小于 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 之前的解释器上运行,并带有上述警告。

于 2010-08-27T19:34:57.840 回答