如何告诉 Python 脚本使用特定版本

Posted

技术标签:

【中文标题】如何告诉 Python 脚本使用特定版本【英文标题】:How do I tell a Python script to use a particular version 【发布时间】:2012-06-25 14:47:06 【问题描述】:

我如何在 main.py 模块中(大概)告诉 Python 使用哪个解释器?我的意思是:如果我想让一个特定的脚本使用 Python 版本 3 来解释整个程序,我该怎么做?

奖励:这将如何影响 virtualenv?我是否认为如果我为我的程序创建一个 virtualenv,然后告诉它使用不同版本的 Python,那么我可能会遇到一些冲突?

【问题讨论】:

【参考方案1】:

您不能在 Python 程序中执行此操作,因为如果您是 shebang 行,shell 会决定使用哪个版本。

如果您不使用带有 shebang 行的 shell 并且只输入 python myprogram.py,它将使用默认版本,除非您在输入 pythonXXX myprogram.py 时具体决定使用哪个 Python 版本。

一旦您的 Python 程序运行,您就已经决定使用哪个 Python 可执行文件来运行该程序。

virtualenv 用于隔离python版本和环境,它专门用于消除冲突。

【讨论】:

所以如果我想用python 2.7.3运行一个程序,我会在终端写:python 2.7.3 main.py? 另外,关于virtualenv:是的,但是如果为一个python版本的所有依赖项设置了virtualenv,然后我使用另一个运行它所包含的程序,那么不会有冲突的可能性? 阅读virtualenv 上的文档,其中包含有关它解决的问题的所有详细信息。【参考方案2】:

我会使用shebang#!/usr/bin/python(第一行代码),最后是Python的序列号;)

然后将 Python 文件作为脚本运行,例如,从命令行运行 ./main.py,而不是 python main.py

当你想从 Linux 命令行运行 Python 时也是如此。

【讨论】:

所以,如果我想要 python 2.7.3,我会使用 #!/usr/bin/python2.7.3 @MikeHalpin 看看你的 /usr/bin 中有什么。您需要引用现有的可执行文件。如果您安装了 2.7.3,那么我相信您是正确的。 并不是说应该有任何理由专门指定 2.7.3 —— 所有 2.X 都应该大部分兼容并且完全兼容 2.7.X。 是的,就像 python2.7 filename.py 用于所有/任何 python 2.7.x 版本 请注意,如果您像在运行 python 脚本时通常那样执行脚本,即从终端运行python <python-file>,这将不起作用。【参考方案3】:

您可以在脚本顶部添加一个 shebang 行:

#!/usr/bin/env python2.7

但这仅在以./my_program.py 执行时有效。

如果您以python my_program.py 执行,则将使用which python 返回的任何Python 版本。

关于:对 virtualenv 使用:virtualenv -p /usr/bin/python3.2 或任何设置它以使用该 Python 可执行文件。

【讨论】:

为了使这个答案完整,可能值得描述适当的 she-bang 语法,因为问题的措辞并不暗示该知识。 如果路径对于shebang来说太长了怎么办?它只允许 128 个字符。我们是否应该在某些install.py 中为python 设置一个别名? 我能以某种方式调试它吗?它对我不起作用,我不明白为什么......它也适用于 Windows 吗?好像是 Unix 语法...【参考方案4】:

虽然 OP 可能在 nix 平台上工作,但此答案可能对非nix 平台有所帮助。我没有体验过 Microsoft Windows 中的 shebang 方法。

改写:shebang 行回答了您“在我的脚本中”的问题,但我相信仅适用于类 Unix 平台。即使是脚本之外的 Unix shell 实际解释了 shebang 行以确定调用哪个版本的 Python 解释器。我不确定,但我相信该解决方案并不能解决 Microsoft Windows 平台用户的问题。

在 Microsoft Windows 世界中,运行特定 Python 版本的简化方式,无需专门为安装的每个特定 Python 版本设置环境变量,只需在 python.exe 前加上您要运行它的路径,例如 C:\Python25\python.exe mymodule.pyD:\Python27\python.exe mymodule.py

但是,您需要考虑 PYTHONPATH 和其他 PYTHON... 环境变量,它们会指向错误的 Python 库版本。

例如,您可能会运行:C:\Python2.5.2\python.exe mymodule

然而,环境变量可能指向错误的版本:

PYTHONPATH = D:\Python27

PYTHONLIB = D:\Python27\lib

很多可怕的乐趣!

因此,在 Windows 中,一种非虚拟环境的方式是使用批处理文件来设置环境并通过在 python.exe 前加上它所在的路径来调用特定的 Python 可执行文件. 这种方式有额外的细节你必须管理;例如,如果您希望控制台在应用程序退出后继续存在,则使用“start”或“cmd.exe”命令的命令行参数来“保存并替换“console”环境”。

您的问题让我相信您有多个 Python 模块,每个模块都需要特定版本的 Python。这可以通过使用 subprocess 模块的启动模块在脚本“内”解决。而不是调用 mymodule.py 你会调用一个调用你的模块的模块;也许 launch_mymodule.py

launch_mymodule.py

import sys
import subprocess
if sys.argv[2] == '272':
  env272 = 
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', 
  launch272 = subprocess.Popen('D:\\Python272\\python.exe mymodule.py', env=env272)

if sys.argv[1] == '252'
  env252 = 
    'PYTHONPATH': 'blabla',
    'PYTHONLIB': 'blabla', 
  launch252 = subprocess.Popen('C:\\Python252\\python.exe mymodule.py', env=env252)

我没有测试过。

【讨论】:

这里是一个MS批处理脚本,非virtualenv,安全的pre-app-launch Python version check @DevPlayer 出色的解释性 BATCH 脚本(在链接中)。另一个con 是您实际上必须为要测试的每个python 版本编写自定义python 脚本。这与使用脚本首选版本python的OP不同。【参考方案5】:

也许不完全符合您的要求,但我发现将其放在我的程序开头很有用:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")

【讨论】:

括号样式函数调用不是python3的新功能吗?这段代码在所有版本的 python 中都能正常工作吗? @TamaMcGlinn 不确定你的意思; [0] 表示它正在引用数组中的第一个条目(在这种情况下表示 Python 版本的第一个数字,例如在 2.7.3 中这将是 2),而不是进行函数调用。 AFAIK 这适用于所有版本的 Python。 我发现python2和python3之间差异的原因是试图使print "hello world"编译。我认为只是打印语句本身发生了变化,因此我感到困惑。感谢您澄清这适用于所有版本的 Python,因为这是必不可少的。【参考方案6】:

在 Windows 上使用不同版本的 Python 时,

我正在使用这种方法在版本之间切换。

我认为这比搞乱shebangs和virtualenvs要好

1) 安装你想要的 python 版本

2) 转到环境变量> PATH

(我假设python版本的路径已经添加到Env.Vars。>PATH)

3) 禁止所有不想使用的python版本的路径

(不要删除路径,只需添加“_sup”之类的后缀)

4) 从终端调用 python

(因此 Windows 将跳过您更改的错误路径, 并且会在你没有抑制的路径上找到 python.exe, 之后会使用这个版本)

5) 通过播放后缀在版本之间切换

【讨论】:

【参考方案7】:

我遇到了这个问题,只是决定将其中一个程序从 python.exe 重命名为 python2.7.exe。现在,我可以在命令提示符下指定要轻松运行的程序,而无需引入任何脚本或更改环境路径。 所以我有两个程序:python2.7 和 python(后者是 v.3.8 又名默认)。

【讨论】:

【参考方案8】:

对于那些使用 pyenv 来控制他们的虚拟环境的人,我发现这可以在脚本中工作:

#!/home/<user>/.pyenv/versions/<virt_name>/bin/python

DO_STUFF

【讨论】:

以上是关于如何告诉 Python 脚本使用特定版本的主要内容,如果未能解决你的问题,请参考以下文章

如何确保脚本由特定版本的 python 执行? [复制]

告诉 python 解释器在脚本本身中使用解释器命令行开关

如何在python中持续按住特定键一段时间?

如何在 script.py 中调用特定的 Python 版本——Windows

用于运行命令行的 Python 脚本,该命令行启动具有特定 Python 版本的 Python 脚本

如何告诉python使用者等待客户端启动