我正在学习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()
并且它仍然没有关闭文件=(
这不会弄乱我的程序,我只想确保我正在关闭文件。
谢谢!
对不起,我是堆栈溢出的新手!
答案 0 :(得分:0)
在这种情况下,请勿将open
的结果传递给不会关闭该过程的过程,因为这样会丢失句柄,这是一种不好的做法。您无法确定python垃圾收集并关闭文件的时刻。
您的尝试无效,您正在尝试关闭其他对象(使用cmd.stdout
或subprocess.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
)