阻止和非阻止子进程调用

Ros*_*hta 61 python subprocess python-2.7 python-3.x

我之间是完全糊涂了subprocess.call(),subprocess.Popen(),subprocess.check_call().

哪个是封锁哪个不是?

如果我用我的意思说的是subprocess.Popen()父进程是否等待子进程return/ exit它继续执行之前.

shell=True这些电话怎么影响?

unu*_*tbu 90

Popen是非阻塞的.call并且check_call正在阻止.您可以Popen通过调用其waitcommunicate方法来创建实例块.

如果您查看源代码,您将看到call调用Popen(...).wait(),这就是它阻塞的原因. check_call电话call,这也是它阻止的原因.

严格来说,shell=True与阻塞问题是正交的.但是,shell=True导致Python执行shell,然后在shell中运行该命令.如果您使用阻止呼叫,则在shell完成时将返回呼叫.由于shell可能会生成一个子进程来运行命令,因此shell可能会在生成的子进程之前完成.例如,

import subprocess
import time

proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()
Run Code Online (Sandbox Code Playgroud)

这里产生了两个进程:Popen生成一个运行shell的子进程.shell反过来产生一个子进程运行ls. proc.terminate()杀死shell,但子进程ls仍在运行.(这是由丰富的输出表现,在python脚本结束后也.准备杀死lspkill ls.)

  • [`start_new_session = True`或其类似物](http://stackoverflow.com/a/13256908/4279)可以立即终止整个过程树.请参阅[如何终止使用shell = True启动的python子进程](http://stackoverflow.com/q/4789837/4279) (4认同)
  • 所以如果我想使用 `shell=True` 并且我希望它阻止执行直到 shell 的内部进程结束,我该怎么做? (3认同)
  • 如果命令来自用户输入,则@dotslash:`shell = True`可能是[安全隐患](https://docs.python.org/2/library/subprocess.html#using-the-subprocess-module).所以如果可能的话,最好使用`shell = False`.使用`shell = False`,在列表中提供命令及其参数:`proc = subprocess.Popen(['/ run_python.py',' - n','10'],shell = False)`. (2认同)
  • @dotslash:`Popen`始终是非阻塞的.它叫`wait`或`communic`阻塞. (2认同)