【问题标题】:How to use multiple versions of Python without uninstallation如何在不卸载的情况下使用多个版本的 Python
【发布时间】:2012-05-14 21:52:23
【问题描述】:

我面临着一个独特的情况,有点微不足道但很痛苦。

我需要使用 Python 2.6.6,因为 NLTK 没有移植到 Python 3(这是我可以收集的)。

在不同的代码(同时工作)中,有一个集合计数器函数,它仅在 Python 3 中可用,但在 Python 2.6.6 中不可用。

所以,每次我在两个代码之间切换时,我都需要安装和卸载版本。太浪费时间了。

关于如何指定要使用的版本有什么建议吗?

【问题讨论】:

  • 安装多个版本即可。
  • Python 2 和 3 可以并排安装。为什么需要卸载重新安装?
  • Windows。是的,它可以并排安装。但是,这可能是一个愚蠢的问题——我如何从 python 代码调用适当的版本(shell)?当我说运行模块时,它总是在 3.0 上运行,这会引发 nltk 错误。
  • 只是设置回路径。您可以轻松地在窗口上使用不同的 python
  • 不是一个独特的情况。我正在使用需要 2.x 的包(pdfminer),但其他项目需要 3.0。这是一个有用的问题,感谢发布。

标签: python python-3.x version nltk


【解决方案1】:

最简单的解决方案:重命名路径所在位置的文件,例如:

【讨论】:

    【解决方案2】:

    您可以使用 py 启动器,它与 python 分发包一起安装:

    py -2    # default python 2
    py -2.7  # specifically python 2.7
    py -3    # default python 3
    py -3.7  # specifically python 3.7
    

    如果您需要执行特定版本的脚本,您可以执行以下操作:

    py -3.7 my_script.py
    

    【讨论】:

      【解决方案3】:

      对于那些使用 Windows 的人,如果您不反对使用 PowerShell,则可以按照其他答案中的说明分别安装 python 2 和 3。然后你可以这样做:

      Set-Alias python27 [some path]\python27\python.exe 
      Set-Alias python33 [some path]\python33\python.exe
      

      为运行每个版本创建一个别名。

      在此链接中描述了保留别名:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_aliases#saving-aliases

      为了成功加载该链接将让您创建的配置文件,您可能需要更改执行策略。

      Set-ExecutionPolicy RemoteSigned
      

      应该可以解决问题,但如果您想了解有关执行策略的更多信息,您可能需要点击此链接:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_execution_policies

      【讨论】:

      • 对于 cmd.exe,使用doskey.com(它实际上是一个 PE exe,而不是 DOS com)。 Windows 控制台支持与每个附加进程的映像名称相关联的别名。您可以使用 doskey 的 /macrofile 选项从文件中加载别名。例如,文件的 [cmd.exe] 部分可以包含 python3=C:\Python34\python.exe $* 行。将 doskey 命令添加到从 HKCU\Software\Microsoft\Command Processor 中的 AutoRun 值加载的 cmd 脚本中。您还可以在交互模式下为别名添加 [python.exe] 部分。
      【解决方案4】:

      安装 Python 3

      Python 3.3 及更高版本将 py.exe 放入 windows 文件夹。 [link] 此可执行文件用于通过文件的第一行确定 python 版本:

      #!/usr/bin/python2.7
      

      将在 Python 2.7 中执行。 安装其他 Python 版本后,必须安装 Python 3 版本。

      其他资源:https://docs.python.org/3/using/windows.html#customization

      pywin https://pypi.python.org/pypi/pywin

      旧解决方案

      我猜你用的是窗户。我通过 hack 解决了这个问题:

      每次我在 Windows 上启动 python 时都会使用一个 python.bat。 这会启动一个 python.py,它会分析 #! 之后的文件以查找 python 版本的标头。

      要启动 example.py,我在控制台中输入

      python example.py
      

      但它也可以按 klick 启动。

      这是我的python文件 C:\bin\python.py

      #!/usr/bin/env python2
      import sys
      import os
      args = sys.argv
      if len(args) <= 1:
          # no arguments
          # start python console
          i = os.system('C:\bin\python2.bat' + " ".join(args[1:]))
          if type(i) != int:
              i = 0
          exit(i)
      
      def analyse(filename, default = ''):
          '''=> '2', '3', default '''
          try:
              f = open(filename)
          except IOError:
              # file not found
              return default
          firstLine = f.readline()
          if firstLine.startswith('#!'):
              if 'python2' in firstLine:
                  return '2'
              if 'python3' in firstLine:
                  return '3'
              i = firstLine.find(' ')
              if i != -1:
                  # analyse from end of path on
                  in2 = '2' in firstLine[i:]
                  in3 = '3' in firstLine[i:]
                  if in2 and not in3:
                      return '2'
                  if in3 and not in2:
                      return '3'
              else:
                  # analyse path
                  in2 = '2' in firstLine
                  in3 = '3' in firstLine
                  if in2 and not in3:
                      return '2'
                  if in3 and not in2:
                      return '3'
          return default
      
      
      
      no = analyse(args[1], default = '2')
      if args[1][-1:] == 'w':
          # python win
          cmd = 'C:\bin\pythonw%s.bat'
      else:
          cmd = 'C:\bin\python%s.bat'
      i = os.system(cmd % no + ' ' + " ".join(args[1:]))
      
      if type(i) != int:
          i = 0
      exit(i)
      

      这是 C:\bin\python.bat 文件

      @echo off
      C:\bin\python2 C:\bin\python.py %*
      rem this may also work:
      rem C:\bin\python.py %*
      

      在你开始的每个文件中,你都必须放一个

      #!/bin/env/python3
      

      #!/bin/env/python2
      

      默认是python2

      然后我将这些文件添加到文件夹中:

      C:\bin\python2.bat

      @echo off
      C:\python27\python.exe %*
      

      C:\bin\pythonw2.bat

      @echo off
      C:\python27\pythonw.exe %*
      

      C:\python3.bat

      @echo off
      C:\python32\pythonw.exe %*
      

      C:\bin\pythonw3.bat

      @echo off
      C:\python32\pythonw.exe %*
      

      如果你使用 python26 而不是 python27 那么你需要改变

      C:\python27 
      

      C:\python26
      

      等等。与不使用 python 32 的 python 相同。

      您可能还希望通过 klick

      启动 python 文件

      然后这样做:

      在 .py 文件上单击鼠标右键 -> 打开 -> 选择 C:\bin\python.bat

      如果您遇到问题,请联系我或发表评论。

      【讨论】:

      • 不错,如果是 hackish,解决 Windows 的损坏问题。
      • 如果你安装python 3作为最后一个版本,它会在Windows下识别#!
      【解决方案5】:

      看看WinPython,一个不错的可移植/可安装 Windows 的 Python 发行版。

      便携:预配置,它应该在 Windows 下的任何机器上开箱即用(没有任何要求),并且包含 WinPython 的文件夹可以移动到任何位置(本地、网络或可移动驱动器)与大多数应用程序设置

      灵活:可以根据需要安装(或者我应该写“使用”,因为它是可移植的)尽可能多的 WinPython 版本(例如隔离和自洽的环境),即使这些版本运行不同同一台机器上的 Python 版本(2.7、3.3)或不同架构(32 位或 64 位)

      它还允许您轻松注册和注销给定的python版本作为系统默认版本。

      但即使是可移植的,您也可以创建 python 可执行文件的快捷方式并将其放在路径中的某个位置。只需将不同版本的快捷方式命名为不同的名称。然后你可以使用:

      python_3_64bit_shortcut your_program.py
      

      【讨论】:

        【解决方案6】:

        使用 virtualenv,它允许您创建动态 python 环境。在这里查看 python 的页面。

        http://pypi.python.org/pypi/virtualenv

        在 windows 上的 virtualenv 中安装包的相关回答问题(相对于系统范围)Can I install Python windows packages into virtualenvs?

        【讨论】:

          【解决方案7】:

          如果你说的是shell,比如在linux中,如果你安装了python 3,你可以用python3命令单独调用它。 Python 2 只是使用python 调用。

          至少这是我使用类似 Ubuntu 系统的经验,我没有使用过其他 Linux 环境。

          我意识到这个问题已经有将近一年的历史了,但 NLTK 已被移植到 Python 3(或者至少在撰写本文时是这样的)。

          【讨论】:

            【解决方案8】:

            OP 请求有点过时了,尤其是现在 NLTK 确实有一个 py3.x 端口。见Install nltk 3.0 on Ubuntu 13.10 using tar.gz download

            这是让 python3 与 NLTK 一起工作的方法。

            $ sudo apt-get install python3-pip
            $ sudo pip3 install pyyaml
            $ wget http://www.nltk.org/nltk3-alpha/nltk-3.0a3.tar.gz
            $ tar -xzvf nltk-3.0a3.tar.gz
            $ cd nltk-3.0a3/
            $ sudo python3 setup.py install
            $ python3
            >>> import nltk
            >>> from nltk.corpus import brown
            >>> print(brown.sents()[0])
            ['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', 'Friday', 'an', 'investigation', 'of', "Atlanta's", 'recent', 'primary', 'election', 'produced', '``', 'no', 'evidence', "''", 'that', 'any', 'irregularities', 'took', 'place', '.']
            

            【讨论】:

              【解决方案9】:

              您可以在 shebang 行中指定您想要的版本。当我的 Ops 人员设置的 VM 在 /usr/bin/python2.6 中有 Python 2.6 时,我刚刚遇到了这个问题,而我需要 2.7 来获得一些功能。他在 /usr/bin/python2.7 为我安装了它。

              我的老舍邦:

              #!/usr/bin/env python
              

              停止工作,因为 /usr/bin/python 是 /usr/bin/python2.6 的链接。最终解决问题并在 Windows、Linux 和 OSX 上工作的方法是将 shebang 更改为:

              #!/usr/bin/env python2.7
              

              我相信它应该适用于任何版本。

              【讨论】:

                【解决方案10】:

                我确实在我的机器 (Windows) 上使用了至少 3 或 4 个版本的 Python。 http://python.org/ 的安装程序自动将它们放置在:

                c:\Python26
                c:\Python27
                c:\Python32
                

                c:\Python24
                

                在一台机器上。我主要使用 Python 2.7,因为一些应用程序使用 wxPython 以及旧的控制台代码。此python.exe 未重命名。顺便说一下,Python 2.7 也支持collections.Counter

                c:\Python26c:\Python24 不包含在我的 PATH 中。在c:\Python32\ 中,exe 被重命名为 py.exe。这样,python some.py 启动 Python 2.7,py another.py 启动 Python 3.2。

                【讨论】:

                  【解决方案11】:

                  使用Pythonbrew,它超级容易安装,让你可以非常轻松的安装、切换,或者安全地临时使用不同的python版本。

                  安装 pythonbrew 后:

                  #to install new python versions is as simple as:
                  pythonbrew install 2.7.2 3.2
                  #to use a particular version in the current shell:
                  pythonbrew use 3.2
                  #to uninstall:
                  pythonbrew uninstall 2.7.2
                  

                  【讨论】:

                    【解决方案12】:

                    您只需在不同的目录中安装多个版本,然后使用您要使用的 Python 版本运行 Python 程序。像这样:

                    C:\Python26\Python.exe thescript.py
                    

                    或类似的。

                    virtualenv 的作用是它为您提供了相同 python 版本的许多单独的“虚拟”安装。这是一个完全不同的问题,因此对您没有任何帮助。

                    【讨论】:

                    • virtualenv 还可以与不同的 Python 版本一起使用,因此当您有一个处于活动状态的 virtualenv 时,python 指向该 virtualenv 的 Python 版本。所以这不是完全无关紧要,虽然它可能是矫枉过正。
                    • @ThomasK:是的,但这并不能解决他的问题,也没有必要解决他的问题。它和咖啡一样重要。这是一个很好的补充,但实际上并没有解决任何问题。
                    • 如果你这样做,你运行的 python 是否知道在适当的文件夹中查找包等?还是 Python 2.6 会在 C:\Python33\Scripts 中查找,因为那是我的 PATH 中的内容?
                    • @LarsH:它知道。不,它不会在您的 PATH 中查找模块。它会在你的 PYTHONPATH 中查找,所以不要全局设置它。
                    【解决方案13】:

                    不确定这是否是你想要的,但我曾经长期忍受这个http://www.portablepython.com/

                    【讨论】:

                      【解决方案14】:

                      此页面有一个适用于 Python 2.6 的 collections.Counter 实现:

                      【讨论】:

                        【解决方案15】:

                        您应该查看virtualenv。我是从this 博客文章中了解到的,其中谈到了pipfabric,这对于Python 开发人员来说也是非常有用的工具。

                        【讨论】:

                          猜你喜欢
                          • 2017-10-29
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-08-24
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多