91

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

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

4

8 回答 8

73

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

#!/usr/bin/env python2.7

但这仅在执行 as 时才有效./my_program.py

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

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

于 2012-06-23T17:05:23.463 回答
60

也许不完全是您所要求的,但我发现这在我的程序开始时很有用:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")
于 2017-01-27T19:49:25.587 回答
22

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

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

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

于 2012-06-23T16:15:44.577 回答
16

虽然 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

但是,您需要考虑指向错误版本的 Python 库的 PYTHONPATH 和其他 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。这可以通过使用子进程模块的启动模块在脚本“内”解决。而不是调用mymodule.py你会调用一个调用你的模块的模块;也许launch_mymodule.py

启动_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)

我没有测试过这个。

于 2012-06-23T18:56:21.997 回答
0

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

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

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

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

于 2012-06-23T15:48:02.000 回答
0

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

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

DO_STUFF
于 2020-11-21T01:45:38.367 回答
-1

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

于 2020-03-24T20:55:54.487 回答
-2

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

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

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

1)安装你想要的python版本

2)转到环境变量> PATH

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

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

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

4)从终端调用python

(所以windows会跳过你改错的路径,会在你没有压制的路径找到python.exe,开启后会使用这个版本)

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

于 2019-05-14T12:52:31.047 回答