Python3子进程文件关闭

时间:2018-11-18 20:56:25

标签: python subprocess python-3.6

我正在学习python3,我从他们的网站上获得了python3.6.6的一些基本代码

但是我也在警告模式-Wd上运行python,所以它会告诉我即使在正在运行的程序中是否还有其他错误。

我正在尝试做一些基本的shell脚本。

https://codecalamity.com/run-subprocess-run/

假设我跑步

import subprocess
import os
print("Welcome to the obs program")

cmd=str(input("enter commands\n"))

print(cmd)

cmd=subprocess.run(cmd,
shell=True,
stdout=open(cmd+" stdout", 'w'),
stderr=open(cmd+" stderr",'w'),
bufsize=1
)

我收到我没有关闭文件=(

ResourceWarning: unclosed file <_io.TextIOWrapper name='ls -l stderr' mode='w' encoding='ANSI_X3.4-1968'>
  bufsize=1

所以我尝试了

cmd.stdout.close()
cmd.stderr.close()

并且它仍然没有关闭文件=(

这不会弄乱我的程序,我只想确保我正在关闭文件。

谢谢!

对不起,我是堆栈溢出的新手!

1 个答案:

答案 0 :(得分:0)

在这种情况下,请勿将open的结果传递给不会关闭该过程的过程,因为这样会丢失句柄,这是一种不好的做法。您无法确定python垃圾收集并关闭文件的时刻。

您的尝试无效,您正在尝试关闭其他对象(使用cmd.stdoutsubprocess.PIPE进行重定向时,subprocess.STDOUT很方便)。

只需使用上下文管理器并处理变量

with open(cmd+" stdout", 'wb') as fout, open(cmd+" stderr",'wb') as ferr:
    cmd=subprocess.run(cmd,
    shell=True,
    stdout=fout,
    stderr=ferr,
    bufsize=1
    )

退出with块时,关闭重定向的输出/错误文件(无需在其上调用close