如何告诉 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.py 或 D:\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 脚本使用特定版本的主要内容,如果未能解决你的问题,请参考以下文章
如何在 script.py 中调用特定的 Python 版本——Windows