Windows下使用bat批处理文件时发现一个奇怪的现象,比如bat文件运行到使用conda激活环境后,程序会直接退出,不会运行之后的指令。
比如我的bat文件长这样:
set PYTHONPATH=.
conda activate rlearn
python xxx.py
pause
但实际上程序运行到conda activate rlearn就会退出了。解决这种跟conda有关的方案可以参考这篇博客,其实就是在调用conda命令时使用call指令。
为了更加广泛地调试这种pause不起作用导致无法判断程序运行出现了什么问题的情况,可以在bat开头加上这么一句指令:
if not defined in_subprocess (cmd /k set in_subprocess=y ^& %0 %*) & exit )
此指令的作用如下:
当你运行这个脚本时:
初始窗口会检测到 in_subprocess 未定义,启动一个新的命令行窗口,设置 in_subprocess 为 y,并递归调用自己。
新的窗口会执行后续的命令,并保持打开状态,允许用户查看输出。
具体解析:
- if not defined in_subprocess:
- 检查环境变量 in_subprocess 是否未定义。
- not defined 是一个条件,如果变量 in_subprocess 未定义,则条件为真。
- (cmd /k set in_subprocess=y ^& %0 %*):
- 如果 in_subprocess 未定义,则执行括号中的命令。
- cmd /k:启动一个新的命令行窗口并执行后续命令。/k 参数表示在执行完命令后保持命令行窗口打开。
- set in_subprocess=y:在新窗口中设置环境变量 in_subprocess 为 y。
- ^&:这是一个转义字符组合,表示逻辑 AND,用于将多个命令组合在一起。在批处理文件中,^ 用于转义特殊字符。
- %0 %*:%0 表示当前批处理文件的名称,%* 表示传递给批处理文件的所有参数。这部分用于递归调用当前批处理文件,并传递原始的所有参数。
- & exit:
- & 是一个命令分隔符,用于在当前行中将多个命令串联在一起。
- exit 命令用于退出当前批处理文件。
- ):
- 结束 if 语句的条件块。