子进程中的“shell”参数在 Windows 上是啥意思?

Posted

技术标签:

【中文标题】子进程中的“shell”参数在 Windows 上是啥意思?【英文标题】:What does the 'shell' argument in subprocess mean on Windows?子进程中的“shell”参数在 Windows 上是什么意思? 【发布时间】:2010-10-20 18:51:09 【问题描述】:

子进程模块的文档声明“如果 shell 为 True,则将通过 shell 执行指定的命令”。在 Windows 操作系统上,这在实践中意味着什么?

【问题讨论】:

【参考方案1】:

表示该命令将使用COMSPEC环境变量中指定的程序执行。通常cmd.exe

确切地说,子进程调用CreateProcess windows api 函数,将"cmd.exe /c " + args 作为lpCommandLine 参数传递。

如果 shell==False,则 CreateProcess 的 lpCommandLine 参数就是 args

【讨论】:

【参考方案2】:

当你执行一个外部进程时,你想要的命令可能看起来像“foo arg1 arg2 arg3”。如果“foo”是一个可执行文件,那就是执行并给出参数的内容。

但是,通常情况下,“foo”实际上是某种脚本,或者可能是 shell 内置的命令,而不是磁盘上的实际可执行文件。在这种情况下,系统不能直接执行“foo”,因为严格来说,这类事情是不可执行的。他们需要某种“外壳”来执行它们。在 *nix 系统上,这个 shell 通常(但不一定)是 /bin/sh。在 Windows 上,它通常是 cmd.exe(或存储在 COMSPEC 环境变量中的任何内容)。

此参数可让您定义您希望使用哪个 shell 来执行您的命令,在相对少见的情况下您不需要默认值。

【讨论】:

【参考方案3】:

除了其他答案中所说的之外,如果您想在该文件类型的默认查看器中打开文件,这在实践中很有用。例如,如果你想打开一个 html 或 PDF 文件,但不知道运行它的系统上安装了哪个浏览器或查看器,或者无法保证可执行文件的路径,你可以简单地传递文件名作为 args 字段的唯一参数,然后设置 shell=True。这将使 Windows 使用与该文件类型关联的任何程序。 一个警告,如果你的文件路径有空格,你需要用两个“。”。

例如。

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

【讨论】:

os.startfile 是一种更好的方法。 哇。我什至不知道它存在。我在 Google 上挖了几个小时,这是我能找到的最好的。【参考方案4】:

在using-the-subprocess-module中,有一个明确的段落:

可执行参数指定要执行的程序。很少需要它:通常,要执行的程序由 args 参数定义。如果 shell=True,可执行参数指定使用哪个 shell。在 Unix 上,默认的 shell 是 /bin/sh。 在 Windows 上,默认 shell 由 COMSPEC 环境变量指定。

Windows 示例 - 如果没有 shell,shell (cmd.exe) 命令 date -t 将无法识别:

>>> p=subprocess.Popen(["date", "/t"], stdout=subprocess.PIPE)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Python26\lib\subprocess.py", line 595, in __init__
    errread, errwrite)
  File "C:\Python26\lib\subprocess.py", line 804, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
>>> 

使用 shell,一切正常:

>>> p=subprocess.Popen(["date", "/t"], shell=True, stdout=subprocess.PIPE)
>>> p.communicate()
('Wed 04/22/2009 \r\n', None)
>>>

【讨论】:

我认为 OP 所寻找的不仅仅是文档的反刍。我认为他们在这种情况下并没有理解 shell 的整个概念,而是在寻找比文档提供的更多的东西。 @BryanOakley - 我不同意。这正是我所需要的。我正在查看文档,但无法找到详细介绍 shell=Trueshell=False 所做的部分,直到我在这里找到了 gimel 的答案,将其拉出来并强调了不同的部分。

以上是关于子进程中的“shell”参数在 Windows 上是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

使用具有与 Windows 中的 & 一样的参数的子进程运行命令

在 Windows 上的 Python Popen 子进程中暂停 FFmpeg 编码

使用 python 子进程检查 pip 是不是安装在 Windows 上

python子进程中的子shell

将 unicode 参数传递给 ShellExecuteEx 中的子进程

python子进程中的子shell