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


76

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

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

Answers:


52

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

#!/usr/bin/env python2.7

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

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

在re:to virtualenv中使用:virtualenv -p /usr/bin/python3.2或进行任何设置以使用该Python可执行文件。


10
要使这个答案完整,可能有必要描述适当的she-bang语法,因为问题的措词并不暗示该知识。
JBentley'17年

如果射手路太长怎么办?它仅允许128个字符。我们是否应该在某些方面为python设置别名install.py
卢卡斯

53

也许与您的要求不完全相同,但是我发现将其放在程序开始时很有用:

import sys

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

括号样式函数调用不是python3的新功能吗?这段代码在所有版本的python中都能正常工作吗?
TamaMcGlinn

1
@TamaMcGlinn不确定您的意思是什么;[0]表示它正在引用数组中的第一个条目(在这种情况下,它表示Python版本的第一个数字,例如在2.7.3中为2),而不进行函数调用。AFAIK可以在所有版本的Python中使用。
重力坟墓

我发现python2和python3之间的区别的原因是试图进行print "hello world"编译。我认为只是印刷声明本身发生了变化,因此我感到困惑。感谢您澄清说这对所有版本的Python都适用,因为这很重要。
TamaMcGlinn

21

我将使用shebang #!/usr/bin/python(代码的第一行)和末尾的Python序列号;)

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

要从Linux命令行运行Python时,情况相同。


7
因此,如果我想要python 2.7.3,我会使用#!/ usr / bin / python2.7.3
jesuis 2012年

@MikeHalpin看看/ usr / bin中的内容。您需要引用现有的可执行文件。如果您安装了2.7.3,那么我相信您是正确的。
Endophage 2012年

并不是说应该有任何理由专门指定2.7.3-所有2.X应该大部分兼容并且完全兼容2.7.X。
Erik

是的,对于所有/任何python 2.7.x版本,都像python2.7 filename.py一样
geekidharsh

2
请注意,如果您像在运行python脚本时一样正常执行脚本(即通过python <python-file>从终端运行)来执行脚本,则此方法将无效。
HelloGoodbye

13

当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中,非virtualenv方式将是使用一个批处理文件来设置环境,并通过在python.exe前面加上其所驻留的路径来调用特定的Python可执行文件。这种方式将提供其他详细信息尽管管理 例如,如果您希望控制台在应用程序退出后仍然存在,则对“开始”或“ cmd.exe”命令使用命令行参数来“保存并替换“控制台”环境”。

您的问题使我相信您有几个Python模块,每个模块都需要特定版本的Python。通过具有使用子过程模块的启动模块,这可以在脚本“内部”解决。除了调用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)

我还没有测试。


1
这是MS批处理脚本,非virtualenv,安全的应用前启动Python版本检查
DevPlayer 2015年

@DevPlayer出色的说明性BATCH脚本(在链接中)。另一个con是您实际上必须为要测试的每个Python版本编写一个自定义python脚本。这与使用脚本的首选python版本的OP不同。
杰西·奇斯霍尔姆

0

您无法在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?
jesuis 2012年

另外,关于virtualenv:是的,但是如果为一个python版本的所有依赖项设置了virtualenv,然后又使用另一个来运行它所包含的程序,那不会有冲突的可能吗?
jesuis 2012年

阅读文档,virtualenv其中包含有关解决问题的所有详细信息。

-2

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

我正在使用此方法在版本之间进行切换。

我认为这比弄乱shebangs和virtualenvs更好

1)安装您想要的python版本

2)转到环境变量>路径

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

3)取消不想使用的所有python版本的路径

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

4)从终端调用python

(因此Windows将跳过您更改的错误路径,并会在您未取消抑制的路径中找到python.exe,并在之后使用该版本)

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


-2

在我的程序开始时将其完全用于python

import sys

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

这段代码将有助于进度


-2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.