我想移动一个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
:
这是一个分两步的过程:
-
创建一个规范文件,列出父环境中的所有包和版本:
conda list --explicit > spec-file.txt
-
使用此包规范列表(文件"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:UsersrichadminAppDataRoaming
、c:usersusername.condaenvs
或c: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
目录中的所有文件夹识别为可命名环境。