在subprocess.Popen中关闭stdin

时间:2014-04-24 21:12:45

标签: python subprocess popen

我们说我写了以下功能。现在的问题是另一个函数使用voronoi.out文件作为输入。我不知道的是如何在sp.Popen完成后关闭这个标准输入。当我不这样做时,qvoronoi计划是"挂"直到我的脚本结束,下一个函数无法读取此voronoi.out文件。

def voronoi(self):

    ''' This function calls qvoronoi program to create 
file with vertices.'''

    self.inp=open(self.out_name, 'r') #Redirect input and output for qvoronoi script
    self.out=open('voronoi.out', 'w') 

    sp.Popen(['./qvoronoi', 'p', 'FN'], stdin=self.inp, stdout=self.out) #Execute qvoronoi

    self.out.close() #Safely close output file

1 个答案:

答案 0 :(得分:3)

主要问题是你不要等待程序退出。当您的功能退出时,qvoronio仍在使用该文件,因此其他人可能会被阻止。由于你不等,qvoronio仍然留在一个僵尸"完成执行时的状态,可能看起来像是挂起的。此外,您将临时的inp / outp文件句柄放在自己的对象上,当你真的想要立即关闭它们时。

更热心的pythonistas喜欢使用上下文管理器来确保文件正确关闭,并且可能会这样做:

def voronoi(self):
    with open(self.out_name, 'r') as inp:
        with open('voronoi.out', 'w') as outp: 
            qvoronio = sp.Popen(['./qvoronoi', 'p', 'FN'], stdin=inp, stdout=oup)
    qvoronio.wait()

请注意,等待是在上下文管理器退出后完成的。在将它们交给孩子后,你已经关闭了父母的文件。

我通常会这样做:

def voronoi(self):
    qvoronio = sp.Popen(['./qvoronoi', 'p', 'FN'], stdin=open(self.out_name, 'r'),
        stdout=open('voronoi.out', 'w'))
    qvoronio.wait()
并且遭受纯粹主义者的愤怒。我的方式适用于cpython,但可能会阻塞你的其他变种。