我可以在同一台Windows计算机上安装Python 3.x和2.x吗?


156

我正在运行Windows,并且在命令行上运行程序时,shell / OS将根据注册表设置自动运行Python。如果我在同一台计算机上安装2.x和3.x版本的Python,这会中断吗?

我想玩Python 3,同时仍然能够在同一台机器上运行2.x脚本。


1
在我的发行版Fedora中,它将在处安装Python 2.7 /usr/bin/python和在处安装Python 3.3 /usr/bin/python3。也为Python3的Pip和IPython提供了不同的名称。非常便利。
Panic Panic

19
@user-本着我的精神,我同意您的回答,但是我被这种精神所困扰,无数次,以至于我理解为什么有人会在做出飞跃之前问。
Peter Hanley 2014年

这里的答案似乎全部与如何选择何时运行python有关。我的问题是安装程序(3.6.2)无法运行,因为它说“已经安装了该产品的另一个版本”。原来我已经安装了3.6.3。
yoyo '18

Answers:


66

共存的官方解决方案似乎是WindowsPython Launcher,PEP 397,它包含在Python 3.3.0中。将发行版转储文件py.exepyw.exe启动器安装到%SYSTEMROOT%C:\Windows)中,然后分别与pypyw脚本关联。

为了使用新启动器(无需手动设置自己的关联),请保持“注册扩展名”选项处于启用状态。我不太确定为什么,但是在我的机器上,它保留了Py 2.7作为(启动器的)“默认”值。

通过直接从命令行调用脚本来运行脚本,这些脚本将通过启动程序进行路由并解析shebang(如果存在)。您还可以显式调用启动器并使用开关:py -3 mypy2script.py

各种各样的shebangs似乎都可以工作

  • #!C:\Python33\python.exe
  • #!python3
  • #!/usr/bin/env python3

以及肆意滥用

  • #! notepad.exe

“他们”确实应该在Windows的当前Python 2发行版中包括pylauncher(或使人们更加意识到它的可用性以及从何处获取)。
martineau

1
也许吧,但是如果您只是生活在Python 2世界中,那并不是一件大事。
尼克T

该发射器是自2012年年至少可作为独立的程序
斯密特Johnth


1
@Mooncrater您可以检查将与一起使用where.exe pip。我认为Python 3安装程序会pip3为其pip 安装一个别名,但是您也可以做类似py -3 -m pip install requests我认为的事情。
尼克T

41

这是我的设置:

  1. 使用Windows安装程序安装Python 2.7和3.4 。
  2. 转到C:\Python34(默认安装路径)并将python.exe更改为python3.exe
  3. 编辑 环境变量以包括C:\Python27\;C:\Python27\Scripts\;C:\Python34\;C:\Python34\Scripts\;

现在在命令行中,您可以使用python2.7和python33.4。


3
例如,pip在cli中呢?
基督徒

3
pip随附了最新版本的python 2&3。因此您可以分别使用pippip3
阿利斯泰尔·马丁

8
我只是指出,您最终不得不重命名所有这些实用程序。即使那样,例如,如果python3显式(例如:硬编码)调用pip而不是pip3,也有可能导致事情中断。
基督教徒

这是一个坏主意,最终会重命名所有内容,而pip不能那样工作。
bhansa

停止在python3上遇到点子问题。您需要从初始的python3安装向导中取消“安装pip”,然后将python3.7 / python.exe重命名为python3.exe,然后下载get-pip.py并运行python3.exe get-pip.py。因此pip3知道重命名的python3.exe是针对python3的,而不是原始的/python3.7/python.exe
Liu

36

您可以同时安装。

您应该在脚本之前编写以下代码:

#!/bin/env python2.7

或者,最终...

#!/bin/env python3.6

更新资料

Google上进行快速搜索后,我的解决方案与Unix完美搭配,这是Windows解决方案:

#!c:/Python/python3_6.exe -u

同样的事情:在脚本之前。


WEll,它可以安装在Linux上,也可以安装在Windows上。您只需要设置env变量即可..您可以在Windows中完成此操作...
Patrick Desjardins

7
该解决方案不适用于Windows(除非您从Unix样式的外壳程序(例如cygwin)中调用它)。#!由外壳处理,而Windows不支持它。我相信,在你用Google搜索它是由Web服务器处理,该示例不是从窗户被推出
布莱恩

是的,在Windows上的Apache上...问题请求外壳会自动出现,您可以使用Cygwin,Apache等来实现
Patrick Desjardins

@ Daok:我没有投票给你。我非常感谢您的帮助,甚至尝试帮助。
薄荷

4
可以使用pylauncher来完成类似的工作(如PEP 397中所述- 2011
martineau 2013年

33

从3.3版开始,Python引入了适用于Windows的Launcher实用程序https://docs.python.org/3/using/windows.html#python-launcher-for-windows

为了能够使用多个版本的Python:

  1. 安装Python 2.x(x是您需要的任何版本)
  2. 安装Python 3.x(x是您需要的任何版本,您还必须拥有一个3.x> = 3.3的版本)
  3. 打开命令提示符
  4. 键入py -2.x以启动Python 2.x
  5. 键入py -3.x启动Python 3.x

1
那使用IDE的人呢?这也行吗?
emorphus

1
@emorphus我想取决于IDE,但通常来说您应该能够选择解释器的版本。因此,如果您安装了多个Python版本,则只需选择要在项目中使用的版本即可。IDE中的终端也与命令提示符相同,因此这些命令也应在此起作用。
伊万·库切拉克

2
这是IMO的最佳解决方案,从一开始就可以完美运行。不需要-3.x就可以了py -3 filename.py
OmegaNalphA

9

我从外壳程序中使用2.5、2.6和3.0,以及以下形式的一行批处理脚本:

:: The @ symbol at the start turns off the prompt from displaying the command.
:: The % represents an argument, while the * means all of them.
@c:\programs\pythonX.Y\python.exe %*

命名它们pythonX.Y.bat并将它们放在PATH中的某个位置。将首选的次要版本(即最新版本)的文件复制到pythonX.bat。(例如copy python2.6.bat python2.bat。)然后您可以python2 file.py在任何地方使用。

但是,这没有帮助甚至影响Windows文件关联的情况。为此,您需要一个启动器程序来读取该#!行,然后将其与.py和.pyw文件关联。


请参阅对Patrick Desjardins答案的评论
martineau

8

将两者都添加到环境变量时,将发生冲突,因为两个可执行文件具有相同的名称:python.exe

只需重命名其中之一即可。就我而言,我将其重命名为python3.exe

因此,当我运行python它将执行python.exe2.7,而当我运行python3将执行python3.exe3.6

在此处输入图片说明


您能详细说明一下吗?当我将python重命名为python3时,我无法再运行pip,因为pip.exe,pip3.exe和pip3.7.exe都依赖于python.exe。当我运行pip时,出现错误=> Fatal error in launcher: Unable to create process using '"c:\users\<my_username>\appdata\local\programs\python\python37-32\python.exe" "C:\Users\<my_username>\AppData\Local\Programs\Python\Python37-32\Scripts\pip.exe" '
Mandar Sadye '19

我不知道,我没有这个问题
谢里夫DZ

@MandarSadye您可以在记事本中打开pip.exe并搜索python.exe。然后用python3.exe替换python.exe
atg

7

干得好...

winpylaunch.py

#
# Looks for a directive in the form: #! C:\Python30\python.exe
# The directive must start with #! and contain ".exe".
# This will be assumed to be the correct python interpreter to
# use to run the script ON WINDOWS. If no interpreter is
# found then the script will be run with 'python.exe'.
# ie: whatever one is found on the path.
# For example, in a script which is saved as utf-8 and which
# runs on Linux and Windows and uses the Python 2.6 interpreter...
#
#    #!/usr/bin/python
#    #!C:\Python26\python.exe
#    # -*- coding: utf-8 -*-
#
# When run on Linux, Linux uses the /usr/bin/python. When run
# on Windows using winpylaunch.py it uses C:\Python26\python.exe.
#
# To set up the association add this to the registry...
#
#    HKEY_CLASSES_ROOT\Python.File\shell\open\command
#    (Default) REG_SZ = "C:\Python30\python.exe" S:\usr\bin\winpylaunch.py "%1" %*
#
# NOTE: winpylaunch.py itself works with either 2.6 and 3.0. Once
# this entry has been added python files can be run on the
# commandline and the use of winpylaunch.py will be transparent.
#

import subprocess
import sys

USAGE = """
USAGE: winpylaunch.py <script.py> [arg1] [arg2...]
"""

if __name__ == "__main__":
  if len(sys.argv) > 1:
    script = sys.argv[1]
    args   = sys.argv[2:]
    if script.endswith(".py"):
      interpreter = "python.exe" # Default to wherever it is found on the path.
      lines = open(script).readlines()
      for line in lines:
        if line.startswith("#!") and line.find(".exe") != -1:
          interpreter = line[2:].strip()
          break
      process = subprocess.Popen([interpreter] + [script] + args)
      process.wait()
      sys.exit()
  print(USAGE)

我刚刚在阅读此线程时就搞定了(因为这也是我所需要的)。我在Ubuntu和Windows上都有Python 2.6.1和3.0.1。如果对您不起作用,请在此处发布修复程序。


1
最好使用它sys.exit(process.returncode)来将已调用脚本的退出状态传播给调用方。
martineau 2012年

4

据我所知,Python使用PATH变量而不是注册表设置来从命令行运行。

因此,如果您在PATH上指向正确的版本,则将使用该版本。请记住,重新启动命令提示符以使用新的PATH设置。


如果您键入“ python myscript.py”,那么您可以输入C:\ python30 \ python.exe来代替,但是如果您只是键入myscript.py而我不想破坏2,则命令提示符会自动执行此操作。 ?脚本(如果我在同一台计算机上安装3.0)。
薄荷

哦,还有薄荷味,可能会有助于您在问题的第一条评论中添加信息,这有点模糊。
詹姆斯·麦克马洪

3

Python安装通常会将.py.pyw.pyc文件与Python解释器相关联。因此,您可以通过在资源管理器中双击Python脚本或在命令行窗口中键入其名称来运行Python脚本(这样就无需键入python scriptname.py,就scriptname.py可以了)。

如果要手动更改此关联,则可以在Windows注册表中编辑以下项:

HKEY_CLASSES_ROOT\Python.File\shell\open\command
HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command
HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command

Python启动器

人们一直在研究Windows的Python启动器:与.py.pyw文件相关联的轻量级程序,它将在第一行中寻找“ shebang”行(类似于Linux等),并以2.x或3.x版本启动Python。需要。有关详细信息,请参见“适用于Windows的Python启动器”博客文章。


3

尝试使用Anaconda。

假设使用Anaconda环境的概念,您需要Python 3来学习编程,但是您不想通过更新Python来消灭Python 2.7环境。您可以创建并激活名为“ snakes”(或所需的任何名称)的新环境,并按如下所示安装最新版本的Python 3:

conda create --name snakes python=3

它比听起来简单,请在此处查看介绍页面:Anaconda入门

然后要解决并排运行2.x和3.x版本的特定问题,请参阅:使用Anaconda管理Python版本


Anaconda简介链接已断开。
Alex

1
修复了“ Anaconda入门”链接。
Cale Sweeney

2
@JeffreyCordero我修复了链接。Anaconda文档可以运行,但不能隐藏。
Cale Sweeney

2

这是在同一台机器上运行Python 2和3的方法

  1. 安装Python 2.x
  2. 安装Python 3.x
  3. 启动Powershell
  4. 输入Python -2以启动Python 2.x
  5. 输入Python -3启动Python 2.x

WindowsPython启动器自3.3版开始嵌入到Python中,正如2011年Stand Stand首次亮相时所承诺的那样:

适用于Windows的Python启动器


那使用IDE的人呢?这也行吗?
emorphus

2

这是在Windows上安装Python2和Python3的一种简洁方法。

https://datascience.com.co/how-to-install-python-2-7-and-3-6-in-windows-10-add-python-path-281e7eae62a

我的情况:我必须安装Apache cassandra。我已经在D:驱动器中安装了Python3 。随着大量开发工作的进行,我不想弄乱我的Python3安装。而且,我只需要Python2用于Apache cassandra。

所以我采取了以下步骤:

  1. 下载并安装了Python2。
  2. 已将Python2条目添加到类路径(C:\Python27;C:\Python27\Scripts
  3. python.exe修改为python2.exe(如下图所示)

在此处输入图片说明

  1. 现在我可以同时运行两者。适用于Python 2(python2 --version)和Python 3(python --version)。 在此处输入图片说明

因此,我的Python3安装保持不变。


1

我认为可以在安装程序中为.py文件设置Windows文件关联。取消选中它就可以了。

如果没有,您可以轻松地将.py文件与以前的版本重新关联。最简单的方法是右键单击.py文件,选择“打开方式” /“选择程序”。在出现的对话框中,选择或浏览到默认情况下要使用的python版本,然后选中“始终使用此程序打开这种文件”复选框。


这就是我所做的。我的Windows Vista机器上仍然有2.5.2和3.0.1。我在安装向导中未选中该复选框(可能已经说过“注册系统”之类的东西-我忘记了)。两者都很好。对于命令行内容,我将py.bat文件放在启动python 3的路径中-没什么花哨的,但是可以满足我的需求。
匿名2009年

1

您应该确保PATH环境变量不包含两个python.exe文件(添加您当前用于每天运行脚本的文件),或按照批处理文件的建议进行操作。除此之外,我不明白为什么不这样。

PS:我安装了2.6作为“主要” python,安装了3.0作为“ play” python。2.6包含在PATH中。一切正常。


1

在我勇敢地同时安装两者之前,我有很多问题。如果我给python,我要py2时会转到py3吗?pip / virtualenv是否会在py2 / 3下发生?

现在看来非常简单。

只需盲目安装它们。确保您获得正确的类型(x64 / x32)。在安装时/安装后,请确保添加到环境变量的路径。

[ENVIRONMENT]::SETENVIRONMENTVARIABLE("PATH", "$ENV:PATH;C:\PYTHONx", "USER")

替换上面命令中的x以设置路径。

然后转到两个文件夹。

导航

python3.6/Scripts/

并将pip重命名为pip3。

如果pip3已经存在,请删除该pip。这将确保just pip将在python2下运行。您可以通过以下方式进行验证:

pip --version

如果您想在python3中使用pip,请使用

pip3 install 

您可以类似地对python文件和其他文件执行相同的操作。

干杯!


1

Easy-peasy,在安装了两个python版本之后,将路径添加到环境变量;请参阅环境变量设置。然后转到python 2和python 3文件夹,分别将它们重命名为python2和python3,如图在这里python2和所示在这里python3。现在在cmd中键入python2或python3以使用所需的版本,请参见这里


0

我假设是这样,我在同一台计算机上并排安装了Python 2.4、2.5和2.6。


我的工作是针对2.x的多个版本,但薄荷想问他们是否可以在3.x上同时运行2.x。两者之间有一些显着差异。请参阅: 2.x和3.x之间的差异
Cale Sweeney

0

我现在刚开始使用python。我正在阅读Zed Shaw的书“以困难的方式学习Python”,该书需要python 2.x版本,但同时也要学习一个需要python 3.x的类。

这就是我所做的。

  1. 下载python 2.7
  2. 运行电源外壳(应该已经在Windows上安装)
  3. 在POWERSHELL中运行python(如果无法识别,请转到步骤4)
  4. 仅当powershell无法识别python 2.7时,才输入以下内容:

“ [[环境] :: SETENVIRONMENTVARIABLE(“ PATH”,“ $ ENV:PATH; C:\ PYTHON27”,“ USER”)“(无外部引号)

  1. 现在键入python,您应该看到它说python 2.7等等等等

现在适用于python 3.x

简单,适用于Windows应用程序的python 3.x下载带有python。因此,只需将适用于Windows的Python应用程序固定到任务栏,或创建桌面快捷方式即可完成!

打开适用于Windows的3.x版Python

打开适用于python 2.x的Powershell

我希望这有帮助!


0

嗯..我现在通过在https://www.python.org/downloads/release/python-365/下载适用于Windows的Python 3.6.5来做到这一点,并确保将安装启动器。然后,我按照使用python 2和python 3的说明进行操作。重新启动命令提示符,然后使用py -2.7来使用Python 2和pypy -3.6来使用Python3。您还可以将其pip2用于Python 2 pippipPython 3 pip


0

我在要使用python3进行大多数工作时遇到了同样的问题,但是IDA pro需要python2。所以,这就是我所做的。

我首先在用户环境变量中创建了3个变量,如下所示:

  1. PYTHON_ACTIVE:最初为空
  2. HOME_PYTHON27:具有安装Python 2的文件夹的路径。例如。“; /脚本;”
  3. HOME_PYTHON38:类似于python 2,此变量包含python 3文件夹的路径。

现在我加了

%PYTHON_ACTIVE%

到PATH变量。因此,基本上说这个“ PYTHON_ACTIVE”包含的内容就是活动的python。我们以编程方式更改“ PYTHON_ACTIVE”的包含内容以切换python版本。

这是示例脚本:

:: This batch file is used to switch between python 2 and 3.
@ECHO OFF

set /p choice= "Please enter '27' for python 2.7 , '38' for python 3.8 : "

IF %choice%==27 (
setx PYTHON_ACTIVE %HOME_PYTHON27%
)

IF %choice%==38 (
setx PYTHON_ACTIVE %HOME_PYTHON38%
)


PAUSE

该脚本将python版本作为输入,并因此将HOME_PYTHON27或HOME_PYTHON38复制到PYTHON_ACTIVE。从而更改了全局Python版本。

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.