如果python中的subprocess.Popen()打开连接,请关闭
我对python非常陌生。我想知道,使用subprocess.Popen
时我们是否需要关闭连接或者子进程会自动关闭连接?如果python中的subprocess.Popen()打开连接,请关闭
process = subprocess.Popen(["mysql", "-uroot", "-ppassword", "database"],
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
process_out, process_err = process.communicate(file("test.sql").read())
print process_out
process
是表示子过程的对象。有了它,你可以做任何你想做的事情,但最后,在处理了所有的沟通后,你应该为.wait()
这样做,以便在很长一段时间内不会有僵尸进程。
只有在.wait()
之后,子进程才会从操作系统的角度来看。
如果你自己处理通信,这是有效的。但是,如果您的情况允许您使用.communicate()
方法,并且您这样做了,则不必调用.wait()
,因为它适合您。
[Popen.communicate()](https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate)等待进程终止。 –
当使用stdout = PIPE和/或stderr = PIPE时,这将会发生死锁,并且子进程会向管道生成足够的输出,从而阻止等待OS管道缓冲区接受更多数据。使用通信()来避免这种情况。 –
当然。通信完成后应该发生'.wait()'。 – glglgl
.communicate()
调用关闭所有管道(如果它是“连接”的意思)并收获子进程。之后你不需要做任何事情。
#!/usr/bin/env python3
from subprocess import Popen, PIPE
with open('test.sql', 'rb', 0) as input_file, \
Popen([cmd] + args, stdin=input_file, stdout=PIPE, stderr=PIPE) as p:
output, errors = p.communicate()
if p.returncode != 0:
raise Error
通常,官方文档中的示例已完成。那里的连接没有关闭。所以你可能不需要关闭。 – HeinzKurt
无关:您可以使用'stdin = open('test.sql','rb',0)'将文件重定向到文件,而无需首先将整个文件加载到您的Python进程中。 – jfs