【问题标题】:conda env move error: conda-script.py create: error: argument -n/--name: not allowed with argument -p/--prefixconda env 移动错误:conda-script.py 创建:错误:参数-n/--name:不允许使用参数-p/--prefix
【发布时间】:2020-07-07 03:24:40
【问题描述】:

我想移动一个 conda 环境,但没有 conda 命令可以执行此操作。

我猜这是因为 conda“硬链接”包到环境和运行时配置变量,并且 conda 索引或 Anaconda 索引和硬链接没有正确更新。我根据conda create --clone v.s. copying the environment directly 做出这个假设(如果这个假设是错误的,请有人澄清。)

因此,当前 conda 限制(无“移动”命令)的解决方法是从父环境“构建相同的环境”。我按照这些指示Building Identical conda environments

conda create --name myenv --file spec-file.txt

但它们不起作用,因为我收到 conda 错误:

conda-script.py create: error: argument -n/--name: not allowed with argument -p/--prefix:

这是一个两步过程:

  1. 创建一个规范文件,列出父环境中的所有包和版本:

    conda list --explicit > spec-file.txt

  2. 使用此包规范列表(文件“spec-file.txt”)重新创建父环境,但为子环境使用新名称,因为 conda 索引需要唯一名称。 (再次,请有人澄清这是否是一个错误的假设。)

但以下带有位置和环境名称的命令会出错(目标位置“C:\ProgramData\Anaconda3\envs”;新环境名称为“newenv2”)。

conda create --prefix "C:\\ProgramData\\Anaconda3\\envs"  --name topss2 --file spec-file.txt

错误:

conda-script.py create: error: argument -n/--name: not allowed with argument -p/--prefix

我希望能够在一个命令中执行此操作并从 spec-file.txt 中指定新的(命名的)环境包,并自己指定位置(不采用 Anaconda 默认值,在我的情况下是 C:\\Users\\richadmin\\.conda\\envs\\topss )。

它可以工作,但不是没有手动步骤

我终于通过使用conda create --name myclone --clone myenv 让它工作了。但是,我必须手动更改到目标目录,然后执行没有规范文件或目标目录名称的克隆命令。我想一步一步地在命令行、脚本或 docker build 上使用它。

问题:有谁知道这是否存在选项:

conda create --name myclone --clone clone_env_name --prefix target_directory

conda --move 在 conda 命令集中的什么位置?

我们需要核心 conda 包中的 conda“移动环境”命令。在错误的位置很容易意外地创建新环境。 conda“移动”命令应该只更新配置变量和硬链接。这将停止浪费文件空间和时间克隆和删除位置不正确的环境。 (是的,我知道,“首先正确使用命令行”,或者了解Anaconda的复杂隐藏的配置界面。)这是一个常见的新手和中级Python环境使用错误,将受益于更完整的@987654332 @ 命令集。

Anaconda 使用自己的默认目录,这会给企业 IT 环境中的 Python 用户带来问题,因为企业 IT 想要将文件安装在以下位置:C:\Users\richadmin\AppData\Roamingc:\users\username\.conda\envsc:\program files\

我通常使用c:\programdata\anaconda3\envs,因为这样不会在公司环境中遇到文件权限和执行问题。

【问题讨论】:

    标签: python anaconda conda


    【解决方案1】:

    没有这样的命令

    没有明确的方法可以同时使用--name--prefix 参数,原因是使用--name 参数隐式定义前缀将创建一个文件夹,其中name 在默认envs_dirs目录。

    解决方法

    不过,有个小秘密是,Conda 会自动将envs_dirs 目录中的任何文件夹都视为具有该文件夹的名称。因此,将 env 移动到另一个目录但仍然可以通过名称引用的一种解决方法是将另一个目录包含在 envs_dirs 中。不过要记住的一件事是,确保envs_dirs 列表保持您希望在默认情况下放置命名环境的优先级。

    示例

    首先,让我们检查一下我当前的配置

    conda config --show envs_dirs
    envs_dirs:
      - /Users/user/miniconda3/envs
      - /Users/user/.conda/envs
    

    因此,默认情况下,所有命名的环境都在第一个目录中创建。假设我们要为 env 添加另一个目录,但不将其设为默认目录。我们将它放在/Users/user/test_envs 中,并且可以这样做:

    mkdir -p /Users/user/test_envs
    conda config --append envs_dirs /Users/user/test_envs
    

    检查新配置显示

    conda config --show envs_dirs
    envs_dirs:
      - /Users/user/miniconda3/envs
      - /Users/user/test_envs
      - /Users/user/.conda/envs
    

    显示它现在已包含在内,但不应覆盖默认位置。

    现在我们可以将现有的环境(比如foo)克隆到这个位置,但我们仍然需要使用--prefix 标志:

    conda create --clone foo --prefix /Users/user/test_envs/bar
    

    这使我们能够按名称激活这个环境,例如,

    conda activate bar
    

    从技术上讲,这仍然不会移动克隆的原始环境,但您可以随意删除它。

    附加说明

    按照上述过程,我们应该保留按名称在默认位置创建环境的能力,例如,

    conda create -n baz
    

    这将在/Users/user/miniconda3/envs/baz 创建一个环境。如果想将新位置设置为命名环境的默认位置,则上面的 --append 命令应替换为 --prepend 标志。

    这些都不会对节省空间产生任何影响。但是,请注意,如果移动到不同的文件系统(例如 /c 驱动器到 /d 驱动器),那么您最终会使用更多空间,因为硬链接只能在单个磁盘中工作。在这种情况下,可能需要考虑启用软链接(有关详细信息,请参阅conda config --describe allow_softlinks)。

    请记住,此解决方法完全取决于 Conda 当前的内部行为,以将 envs_dirs 目录之一中的所有文件夹识别为可命名的环境。

    【讨论】:

    • 谢谢。我会试试的。非常感谢您如此详细地澄清事情。
    • 一个问题为我澄清未来的事情。配置环境中的第一行是否用作将创建任何新环境的“默认”位置?在您的示例中,这将是 envs_dirs 变量之后的第一行。 " - /Users/user/miniconda3/envs" 命令的输出 conda config --show envs_dirs 显示 envs_dirs: - /Users/user/miniconda3/envs - /Users/user/.conda/envs
    • @RichLysakowskiPhD 是的,第一行是默认的
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多