conda-env移动错误:conda-script.py创建:错误:参数-n/-名称:不允许使用参数-p/-前缀



我想移动一个conda环境,但没有conda命令可以做到这一点。

我猜想这是因为conda;硬链接";环境和运行时配置变量的包,以及conda索引或Anaconda索引和硬链接没有正确更新。我基于conda-create——clone v.s.直接复制环境做出了这个假设(有人请澄清这个假设是否错误。)

因此,这个当前conda限制(没有"移动"命令)的解决方法是"移动";构建相同的环境";来自父环境。我按照以下说明构建相同的conda环境:

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让它工作了。但是,我不得不手动更改到目标目录,然后在没有spec文件或目标目录名的情况下执行克隆命令。我想一步到位,在命令行、脚本或docker构建中使用它。

问:有人知道是否有选择吗

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

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

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

Anaconda使用自己的默认目录,这给公司IT环境中的Python用户带来了问题,因为公司IT希望在以下位置安装文件:C:UsersrichadminAppDataRoamingc:usersusername.condaenvsc:program files

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

没有这样的命令

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

变通办法

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

示例

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

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

因此,默认情况下,所有命名的env都会在第一个目录中创建。假设我们想为envs添加另一个目录,但不将其设为默认目录。我们将把它放在/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

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

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

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

这使我们能够通过名称激活这个env,例如

conda activate bar

从技术上讲,这仍然不能移动被克隆的原始env,但你可以自由删除它。

其他注意事项

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

conda create -n baz

这将在CCD_ 25处创建环境。如果希望将新位置作为命名env的默认位置,则应将上面的--append命令替换为--prepend标志。

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

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

相关内容

最新更新