我们说我写了以下功能。现在的问题是另一个函数使用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
答案 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,但可能会阻塞你的其他变种。