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

标签 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

最佳答案

主要问题是您没有等待程序退出。当您的函数退出时,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/

相关文章:

python - 将给定点上的 3x3 数组求和到另一个保持边界的矩阵

python - 如何使我的 python 脚本不会因错误的 Popen 命令而崩溃?

python - 在 python 中使用重定向运行 bash 命令

python - subprocess.Popen() 的每个实例都有自己的外壳吗?

c++ - 从 std::string vector 返回 char

python - 具有 "dynamic"模式的 flask-sqlalchemy 跨数据库

python - 在 re.sub 中使用变量名

Python/Django 根据字符串是否存在连接字符串

python - 如何使用子进程有效地测试基于 readline 的 Python 程序?

python - 弹出错误: "[Errno 2] No such file or directory" when calling shell function