Windows中subprocess的'shell'参数是什么意思?

1 投票
4 回答
1614 浏览
提问于 2025-04-15 11:11

subprocess模块的文档说“如果shell为真,指定的命令将通过shell执行”。这在Windows操作系统上实际意味着什么呢?

4 个回答

0

除了其他回答中提到的内容,如果你想用默认的程序打开某种文件,这个方法在实际操作中会很有用。例如,如果你想打开一个HTML或PDF文件,但不知道在运行这个程序的电脑上安装了哪个浏览器或查看器,或者不确定程序的路径,你可以只把文件名作为唯一的参数放在args字段里,然后设置shell=True。这样,Windows就会使用与该文件类型关联的程序来打开它。

需要注意的是,如果你的文件路径中有空格,你需要用两个双引号把它包起来。

例如:

path = "C:\\Documents and Settings\\Bob\\Desktop\\New Folder\\README.txt"
subprocess.call('""' + path + '""', shell = True)
3

这句话的意思是,命令会通过一个叫做COMSPEC的环境变量中指定的程序来执行。通常情况下,这个程序是cmd.exe

更准确地说,子进程会调用一个叫做CreateProcess的Windows API函数,并把"cmd.exe /c " + args作为lpCommandLine参数传进去。

如果设置了shell为False,那么传给CreateProcess的lpCommandLine参数就是简单的args

1

当你想要运行一个外部程序时,输入的命令可能看起来像是“foo arg1 arg2 arg3”。如果“foo”是一个可执行文件,那它就会被执行,并且会接收后面的参数。

不过,很多时候“foo”其实是某种脚本,或者是一个内置于命令行的指令,而不是电脑硬盘上实际存在的可执行文件。在这种情况下,系统不能直接执行“foo”,因为严格来说,这些东西并不是可执行的。它们需要某种“命令行解释器”来运行。在类Unix系统中,这个命令行解释器通常是/bin/sh,但不一定。在Windows系统中,通常是cmd.exe(或者是存储在COMSPEC环境变量中的其他程序)。

这个参数让你可以指定想要使用哪个命令行解释器来执行你的命令,适用于那些比较少见的情况,当你不想使用默认的解释器时。

撰写回答