bat脚本中激活conda环境后无法执行其他命令

1. 问题

由于做实验的原因,经常需要在个人电脑上使用jupyter notebook,而我的jupyter notebook是使用anaconda进行管理的,因此需要先激活conda的环境,然后再启动jupyter notebook,我希望把这些都写入bat中,需要用的时候直接用bat文件运行就可以使用jupyter了。

于是我有了第一个bat脚本:

@echo off
cd /d C:\\Users\\yourname\\yourfolder
conda activate myenv
jupyter notebook

但是发现,跑到conda activate myenv之后,就无法继续往下跑了,上网找了一下,使用call解决了问题。

2. 解决

使用call调用conda激活环境,然后再执行jupyter notebook。

cd /d C:\\Users\\yourname\\yourfolder
call conda activate myenv
jupyter notebook

那call是什么命令呢?为什么这里用call之后又正常执行呢?

3. 分析

3.1. call命令

关于call命令,它的作用是在批处理脚本中,用来从一个批处理脚本中调用另一个批处理脚本。调用另一个批处理程序,并且不终止父批处理程序(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。更多call命令的用法查看参考[1]。

因此,可以猜测我们这里调用的

conda activate myenv

命令实际上调用的是一个批处理文件,因此这里如果不用call,便会执行完conda的批处理文件后,直接杀掉父bat所在的进程。

3.2. 测试

以上仅仅是猜测,那么究竟在win系统中,调用conda命令时,实际执行的是批处理文件还是exe文件呢?

在cmd中执行:

where conda

输出:

C:\Users\yourpath\anaconda3\condabin\conda.bat
C:\Users\yourpath\anaconda3\Library\bin\conda.bat
C:\Users\yourpath\anaconda3\Scripts\conda.exe

发现Library中的conda.bat也是指向C:\Users\yourpath\anaconda3\condabin\conda.bat。

编辑这个文件,在前面增加一句输出

echo “it's a bat”

重新打开cmd,执行

conda activate myenv

激活成功的同时,终端打印出:

it's a bat

3.2. 结论

win系统在调用conda命令的时候,实际上是调用conda.bat文件,因此需要在前面加上call命令。

知道这个原因,我们也可以通过更简洁的方式启动jupyter:

@echo off
cd /d C:\\Users\\yourname\\yourfolder
cmd /k "conda activate d2l && jupyter notebook"

4. 参考

[1] 批处理命令——call 和 start

(完)

posted @ 2023-05-15 12:40  大师兄啊哈  阅读(1053)  评论(0编辑  收藏  举报