非常具体的问题(我希望):以下三个代码有什么区别?
(我希望只是第一个不会等待子进程完成,而第二个和第三个会等待。但我需要确定这是唯一的区别......)
我也欢迎其他评论/建议(尽管我已经很清楚shell=True
危险和跨平台限制)
请注意,我已经阅读了Python 子进程交互,为什么我的进程可以使用 Popen.communicate,而不是 Popen.stdout.read()?并且我不想/不需要之后与程序交互。
另请注意,我已经阅读了 Python Popen.communicate() 内存限制的替代方案?但我并没有真正明白...
最后,请注意,我知道当一个缓冲区使用一种方法填充一个输出时,某处存在死锁的风险,但我在互联网上寻找明确的解释时迷路了......
第一个代码:
from subprocess import Popen, PIPE
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
stdout = process.stdout.read()
stderr = process.stderr.read()
return process, stderr, stdout
第二个代码:
from subprocess import Popen, PIPE
from subprocess import communicate
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
(stdout, stderr) = process.communicate()
return process, stderr, stdout
第三个代码:
from subprocess import Popen, PIPE
from subprocess import wait
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
code = process.wait()
stdout = process.stdout.read()
stderr = process.stderr.read()
return process, stderr, stdout
谢谢。