use*_*332 9 python python-3.x conda
我希望运行一个简单的Shell脚本来简化某些conda环境的管理。conda activate在linuxos中通过os 激活conda环境在shell中工作正常,但在shell脚本中却存在问题。有人能为我指出正确的方向的原因吗?
重复该问题的示例:
# default conda env
$ conda info|egrep "conda version|active environment"
active environment : base
conda version : 4.6.9
# activate new env to prove that it works
$ conda activate scratch
$ conda info|egrep "conda version|active environment"
active environment : scratch
conda version : 4.6.9
# revert back to my original conda env
$ conda activate base
$ cat shell_script.sh
#!/bin/bash
conda activate scratch
# run shell script - this will produce an error even though it succeeded above
$ ./shell_script.sh
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run
$ conda init <SHELL_NAME>
Currently supported shells are:
- bash
- fish
- tcsh
- xonsh
- zsh
- powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.
Run Code Online (Sandbox Code Playgroud)
Sim*_*mba 20
为快速解决方案bash:在前面加上下面的init脚本到您的bash脚本。
eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"
Run Code Online (Sandbox Code Playgroud)
完毕。
对于其他 shell,请检查您的 shell 的 init conf,将以下内容复制到 shell conf 中并将其添加到您的脚本中。
# >>> conda initialize >>>
...
# <<< conda initialize <<<
Run Code Online (Sandbox Code Playgroud)
你也可以使用
conda init --all --dry-run --verbose
Run Code Online (Sandbox Code Playgroud)
获取脚本中所需的初始化脚本。
这是通过引进相关conda init的conda4.6。
Conda 4.4 允许“conda activate envname”。问题是设置 shell 以使用这个新功能并不总是那么简单。Conda 4.6 添加了广泛的初始化支持,以便比以往更多的 shell 可以使用新的“conda activate”命令。有关更多信息,请阅读“conda init –help”的输出
conda init在conda4.6中引入之后,conda 仅将命令公开
conda到PATH“base”中的所有二进制文件中,而不是所有二进制文件中。环境开关由统一conda activate env-name并conda deactivate在所有平台上。
但是要使这些新命令起作用,您必须使用conda init.
问题是你的脚本文件是在一个子 shell 中运行的,并且conda没有在这个子 shell 中初始化。
Lam*_*mma 14
在 shell 脚本中使用conda activate或source activate并不总是有效,并且可能会抛出这样的错误。一个简单的解决方法是将它放在脚本中的source ~/miniconda3/etc/profile.d/conda.sh任何conda activate命令之上:
source ~/miniconda3/etc/profile.d/conda.sh # Or path to where your conda is
conda activate some-conda-environment
Run Code Online (Sandbox Code Playgroud)
这是对我有用的解决方案,如果共享脚本也适用。这也解决了必须使用的问题,conda init因为在我使用过的某些集群上,系统已初始化,但conda activate仍无法在 shell 脚本中工作。
小智 8
如果你想使用shell脚本来运行另一个conda环境中的另一个python文件,只需通过以下命令运行另一个文件即可。
os.system('conda run -n <env_name> python <path_to_other_script>')
Run Code Online (Sandbox Code Playgroud)
小智 8
来自Github的这个答案对我有用(我使用的是 Ubuntu,所以它不仅仅适用于 Windows):
eval "$(conda shell.bash hook)"
conda activate my_env
Run Code Online (Sandbox Code Playgroud)
该错误消息很有帮助-告诉您在运行脚本的子外壳中未正确设置conda。要在脚本中使用conda,您将需要(如错误消息所述)运行conda init bash(或您的外壳是什么)首先。conda的行为及其设置方式取决于您的conda版本,但4.4+版本行为的原因conda是取决于通常由conda shell本身设置的某些环境变量。最重要的是,此变更日志条目解释了为什么您的conda activate和deactivate命令在4.4及更高版本中不再表现出预期的行为。
有关此问题的更多讨论,请参见GitHub上的官方conda问题。
编辑:更多研究告诉我,conda init错误消息中提到的功能实际上是v4.6.0的新功能,该功能允许快速设置环境,以便您可以使用它conda activate来代替旧的source activate。但是,这样做的原因是它添加/更改了当前shell的几个环境变量,并且还更改了RC文件(例如.bashrc:),并且RC文件的更改从未在当前shell中被获取-仅在新创建的外壳中贝壳。(除非您当然再次提供.bashrc)。实际上,conda init --help这么说:
重要信息:运行后
conda init,大多数外壳都需要关闭并重新启动才能使更改生效
但是,你显然已经运行conda init,因为你是能够使用conda activate交互。实际上,如果打开.bashrc,则应该可以看到conda教您的shell在哪里寻找conda命令,从而增加了几行内容。但是,脚本的问题在于,.bashrc 不是由运行shell脚本的子shell所提供的(有关更多信息,请参见此答案)。这意味着,即使您的非登录交互式shell看到了conda命令,您的非交互式脚本子shell也不会-不管您调用了多少次conda init。
这就导致了一个猜想(我自己在Linux上没有conda,所以我无法对其进行测试),可以通过这样运行脚本来实现:
bash -i shell_script.sh
Run Code Online (Sandbox Code Playgroud)
您应该可以conda activate正常工作。为什么?-i是一个bash标志,告诉外壳程序您将开始以交互方式运行,这意味着它将自动获取您的.bashrc。这应该足以使您能够像正常使用一样在脚本中使用conda。
小智 6
我使用“源命令”运行shell脚本,它可以正常工作:
source shell_script.sh
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11608 次 |
| 最近记录: |