假设我编写了以下函数。现在的问题是另一个函数使用 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
最佳答案
主要问题是您没有等待程序退出。当您的函数退出时,qvoronio 仍在使用该文件,因此其他函数可能会被阻止。由于您不等待,qvoronio 在执行完成后仍处于“僵尸”状态,这可能看起来像是挂起的。另外,您将临时 inp/outp 文件句柄放在 self 对象上,而实际上您想立即关闭它们。
更多热心的 pythonista 喜欢使用上下文管理器来确保文件正确关闭,并且可能会执行以下操作:
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 来说效果很好,但在其他变体中可能会让你陷入困境。
关于python - 关闭 subprocess.Popen 中的标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23279941/