Windows下subprocess多行命令shell=True仅执行首命令的原因咨询
问题原因及解决方案
这是因为Windows和Linux下shell=True调用的底层Shell程序完全不同,解析命令的逻辑差异导致的:
- Linux下
shell=True默认调用bash(或其他兼容POSIX的Shell),这类Shell会把换行符当作命令分隔符,自动拆分并执行多行命令。 - Windows下
shell=True默认调用cmd.exe,它不把\r\n当作命令分隔符,只会执行第一个换行前的命令,后面的内容直接被忽略。
解决办法
在Windows的cmd.exe里,要执行多条命令需要用专门的分隔符:
- 使用
&分隔多条命令(不管前一条是否成功,都会执行下一条)
执行后Windows下输出:import subprocess r = subprocess.run("echo 1&echo 2", shell=True, capture_output=True, text=True) print(r.stdout)1 2 - 若想保留换行格式,可以用
cmd.exe的换行转义符^,把命令写成:import subprocess r = subprocess.run("echo 1^\r\necho 2", shell=True, capture_output=True, text=True) print(r.stdout) - 另外,
&&也是cmd.exe的命令分隔符,它只会在前一条命令执行成功时才执行下一条,适合有依赖关系的命令。
内容的提问来源于stack exchange,提问作者Schorschii
相关产品推荐
相关产品推荐

