2015-09-04 182 views
1

我对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 
+2

通常,官方文档中的示例已完成。那里的连接没有关闭。所以你可能不需要关闭。 – HeinzKurt

+0

无关:您可以使用'stdin = open('test.sql','rb',0)'将文件重定向到文件,而无需首先将整个文件加载到您的Python进程中。 – jfs

回答

1

process是表示子过程的对象。有了它,你可以做任何你想做的事情,但最后,在处理了所有的沟通后,你应该为.wait()这样做,以便在很长一段时间内不会有僵尸进程。

只有在.wait()之后,子进程才会从操作系统的角度来看。

如果你自己处理通信,这是有效的。但是,如果您的情况允许您使用.communicate()方法,并且您这样做了,则不必调用.wait(),因为它适合您。

+1

[Popen.communicate()](https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate)等待进程终止。 –

+0

当使用stdout = PIPE和/或stderr = PIPE时,这将会发生死锁,并且子进程会向管道生成足够的输出,从而阻止等待OS管道缓冲区接受更多数据。使用通信()来避免这种情况。 –

+0

当然。通信完成后应该发生'.wait()'。 – glglgl

1

.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