【问题标题】:Using multiple Python engines (32Bit/64bit and 2.7/3.5)使用多个 Python 引擎(32Bit/64bit 和 2.7/3.5)
【发布时间】:2016-02-16 00:25:02
【问题描述】:

我想将 Python 用于科学应用程序,经过一些研究决定我将使用 Anaconda,因为它捆绑了大量的软件包,并通过 cmd 使用 conda install 添加新模块很容易。

我更喜欢使用 64 位版本以获得更好的 RAM 使用率和效率,但是 也需要 32 位版本,因为有些库是 32 位的。同样,我更喜欢使用 Python 3.5,因为这是未来的发展方向。但是很多库仍然是 2.7,这意味着我需要两者。

我必须安装 4 个版本的 Anaconda(64bit 2.7、64bit 3.5、32bit 2.7、64bit 3.5)。每个版本约为 380MB。我的目标是使用 Jupyter notebook 和 Spyder 作为 IDE。我必须在需要时在版本之间切换。我遇到了冲突的库、路径问题和各种奇怪的问题。

所以,我打算从头开始进行全新安装。我想知道是否有更明智的方法来处理这个问题。如果这很重要,我现在使用 Windows 7 64 位。

【问题讨论】:

  • 您不需要为每个 python 版本单独安装 conda。相反,您可能想熟悉 conda 环境的概念。现在应该可以从几乎任何库中获得 64 位版本。如果不是这种情况(我肯定会检查),您将不得不维护两个单独的 anaconda 版本,这会使事情变得更加复杂
  • @cel 这太酷了! conda 环境可能是我正在寻找的。快速浏览conda.pydata.org/docs/py2or3.html 表明我可以为 2.7、3,5 等提供多个环境以及单独的库。但我不确定 32 位/64 位问题是否可以分配到环境中。无论如何,如果您可以添加您的评论作为答案,那就太好了。
  • 为什么要打扰 anaconda? Vanilla python 拥有 anaconda 所拥有的一切,而且更加灵活,您可以使用 pyenv 之类的东西轻松安装多个环境并将它们分叉。

标签: python python-3.x python-2.7 anaconda conda


【解决方案1】:

确保设置正确的环境变量 (https://github.com/conda/conda/issues/1744)

为 32 位 Python 2.7 创建新环境:

set CONDA_FORCE_32BIT=1
conda create -n py27_32 python=2.7

激活它:

set CONDA_FORCE_32BIT=1
activate py27_32

停用它:

deactivate py27_32

为 64 位 Python 3.5 创建一个:

set CONDA_FORCE_32BIT=
conda create -n py35_64 python=3.5

激活它:

set CONDA_FORCE_32BIT=
activate py35_64

最好将激活命令写入批处理文件,这样您只需键入一个命令,并且不会忘记设置正确的 32/64 位标志。

更新

您无需为此安装完整的 Anaconda 发行版。 Miniconda就够了:

这些 Miniconda 安装程序包含 conda 包管理器和 Python。安装 Miniconda 后,您可以使用 conda 命令安装任何其他软件包并创建环境等...

安装程序有两种变体:Miniconda 是基于 Python 2 的,而 Miniconda3 是基于 Python 3 的。请注意,安装哪个 Miniconda 的选择仅影响根环境。无论您安装哪个版本的 Miniconda,您仍然可以同时安装 Python 2.x 和 Python 3.x 环境。

我建议您使用 Miniconda3 64 位作为您的根环境。

您以后可以随时安装完整的 Anaconda:

conda install anaconda

请注意,它可能会降级您之前在活动环境中安装的一些软件包。

【讨论】:

  • 不错。我是否只安装任何一个版本的 anaconda(比如 64 位 2.7)并设置环境?还是我需要安装多个版本的 anaconda 才能使环境正常工作?
  • 在我的回答中添加了一段关于 Miniconda 的内容。这应该可以回答您的问题。
  • 非常感谢!直到现在才知道CONDA_FORCE_32BIT
  • 谢谢!我一直在寻找这个很久,我唯一能反复找到的就是“这是不可能的”......
  • 看来 CONDA_FORCE_32BIT 正在消失,目前这并不容易工作:github.com/conda/conda/issues/1744
【解决方案2】:

我只是想补充 Mike Mullers 的答案,因为我还希望我的 IPython 在 32 位和 64 位之间切换。

设置好 32bit 或 64bit 环境后。使用以下命令

pip install ipykernel

在这个环境上安装 ipykernel。然后分配它:

python -m ipykernel install --user --name myenv --display-name "Python (myenv)"

这里的 myenv 是您的新环境的名称。有关切换内核的更多详细信息,请参见此处的此页面 - http://ipython.readthedocs.io/en/stable/install/kernel_install.html

【讨论】:

    【解决方案3】:

    设置子目录约束

    Conda 有一个配置变量 subdir,可用于将包搜索限制在平台上(例如 win-32)。我认为最简单的过程是创建空环境,将其设置为 subdir,然后继续(受限)安装。例如,

    win-32,Python 2.7

    conda create -n py27_32
    conda activate py27_32
    conda config --env --set subdir win-32
    conda install python=2.7
    

    win-64,Python 3.7

    conda create -n py37_64
    conda activate py37_64
    conda config --env --set subdir win-64
    conda install python=3.7
    

    或者,例如,如果您需要从 YAML 文件创建环境,但想要一个 win-32 平台,可以使用CONDA_SUBDIR 环境变量:

    set CONDA_SUBDIR=win-32
    conda env create -f env.yaml -n my_env_32
    set CONDA_SUBDIR=
    conda activate my_env_32
    conda config --env --set subdir win-32
    

    这个过程的好处是,现在在激活 env 时始终会设置变量,因此将来对 env 的更改将保留在指定的子目录中。


    临时约束

    也可以在--channel|-c 参数中指定平台:

    conda install -c defaults/win-32 --override-channels python=3.7
    

    这里需要--override-channels 以确保仅使用提供的频道和子目录 (win-32)。

    但是,在整个 env 上设置 subdir 可能是一种更可靠的做法。


    YAML 约束

    也可以在 YAML 环境定义中使用 subdir 规范。然而,这不太可靠(见下文和 cmets)。例如,

    py37_win32.yaml

    name: py37_win32
    channels:
     - defaults/win-32
    dependencies:
     - python=3.7
    

    @Bicudo 已尝试过此操作并确认它有效,但指出它不会对未来的环境更新设置任何特定于环境的限制。此外,@Geeocode 指出默认子目录仍然可以泄漏,这可能是由于conda env create 在求解过程中仍然可以访问全局通道配置(conda env create 没有等效的--override-channels 标志)。因此,在创建环境之前和之后仍然设置 subdir 是一种很好的做法,例如,

    set CONDA_SUBDIR=win-32
    conda env create -f py37_win32.yaml
    set CONDA_SUBDIR=
    conda activate py37_win32
    conda config --env --set subdir win-32
    

    或者,从 Conda v4.9 开始,也可以将环境变量指定为 YAML 的一部分。也就是说,可以在创建环境时有效地定义环境的CONDA_SUBDIR 值:

    py37_win32.yaml

    name: py37_win32
    channels:
     - defaults/win-32
    dependencies:
     - python=3.7
    variables:
      CONDA_SUBDIR: win-32
    

    【讨论】:

    • 最后一个选项有效,但不设置子目录会导致 pip 依赖项出现问题,并在以后进行任何包修改(conda 将尝试取代 64 位版本的安装)。
    • @Bicudo 感谢提供反馈。一个澄清,当进行“包修改”时,你的意思是使用conda install吗?或者您是否尝试过仅使用 YAML 的方法,即编辑 YAML,然后使用 conda env update?另外,我很惊讶pip 会成为一个问题。只要 pip 模块包含在原始 YAML 中,它就应该是特定于架构的,并且与安装的 Python 适当匹配。
    • 是的,conda install 引起了这里提到的问题,但我还没有尝试过conda env update,这确实可能会更好。对于 pip,我不完全确定,您可能是对的,也许问题确实只出在 conda 上。我看到你更新了你的答案,很好:)所以我可能可以删除我的评论,以免对 pip 问题造成任何误解。
    • 刚试过,没有 CONDA_FORCE_32BIT 不行,因为它安装了 64 位 Python。
    • 我确认,set CONDA_SUBDIR=win-32 最终按预期工作。感谢您的努力。
    【解决方案4】:

    (现在在 conda win64 - python64 activate env 中)

    set CONDA_SUBDIR=win-32
    conda install python
    

    你会看到

    以下包将被更高优先级的包所取代 频道:

    ca-certificates anaconda/pkgs/main/win-64::ca-certifi~ --> anaconda/pkgs/main/win-32::ca-certificates-2021.7.5-h9f7ea03_1
    openssl anaconda/pkgs/main/win-64::openssl-1.~ --> anaconda/pkgs/main/win-32::openssl-1.1.1k-hc431981_0 python
    anaconda/pkgs/main/win-64::python-3.9~ --> anaconda/pkgs/main/win-32::python-3.9.5-h53c7b84_3

    继续([y]/n)?

    只需输入“y”

    此设置保存在文件“\anaconda\envs\you env\.condarc”中

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多