在python中使用tee命令写入文件

时间:2014-03-03 13:38:25

标签: python echo tee

我有一个带有变量名称的python脚本,例如V和It。我根据参数创建了一个文件名,如下所示:

 file_out=io.open("file_Iter" + str(It) + "_V_" +str(V)+".txt", 'w')

然后我想将我的所有终端输出重定向到这个文件,所以我使用这个命令:

 os.system("echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | tee -a $file_out")

创建了file_out,并且终端上的echo命令也正确显示,但是没有写入file_out。如果在tee命令中,我将例如tee testfile.txt放入,则创建此文件并在其中写入echo命令。

问:如何更改tee以便写入由变量名创建的文件?

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确,但我想您想要做的是以下内容:

fileName = "file_Iter" + str(It) + "_V_" +str(V)+".txt"
file_out=io.open(fileName, 'w')
os.system("echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | tee -a " + fileName)

注意命令的结尾,其中连接了fileName。

答案 1 :(得分:0)

$file_out是指shell变量 - 您正在执行此命令的shell上下文中的变量。但是,file_out是Python脚本上下文中的Python变量。

因此,我们需要将它从Python传递到shell中。幸运的是,Python提供了一种使用字符串格式化命令执行此操作的简单方法。我想这会做你想做的事:

os.system("echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | " + 
          "tee -a {}".format(file_out))

然而,有一些担忧。首先,您应该使用subprocess.Popen而不是os.system - 它是intended to replace os.system的新模块。

此外,您应该知道,根据VIt的内容,此shell可能会运行意外命令。想象一下,V的值为'.txt ; sudo rm -rf / #'。现在您的文件名是'file_IterIt_V_.txt ; sudo rm -rf / #.txt',而您的shell命令是'echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | tee -a file_IterIt_V_.txt ; sudo rm -rf / #.txt',它会很乐意从您的计算机中删除许多文件。如果您要执行此操作,则应确保在shell命令中使用escape the filename