gpt4 book ai didi

python - 关闭 subprocess.Popen 中的标准输入

转载 作者:行者123 更新时间:2023-11-30 23:24:48 25 4
gpt4 key购买 nike

假设我编写了以下函数。现在的问题是另一个函数使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com