用python中的tee命令写入文件

用python中的tee命令写入文件,python,echo,tee,Python,Echo,Tee,我有一个带有变量名的python脚本,例如V和It。我根据参数创建文件名,如下所示: file_out=io.open("file_Iter" + str(It) + "_V_" +str(V)+".txt", 'w') 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

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

 file_out=io.open("file_Iter" + str(It) + "_V_" +str(V)+".txt", 'w')
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)
然后,我想将所有终端输出重定向到该文件,因此我使用以下命令:

 os.system("echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | tee -a $file_out")
将创建文件输出,并且在终端上正确显示echo命令,但不会写入文件输出。如果在tee命令中,我放入例如tee testfile.txt,那么将创建此文件,并且echo命令也将写入其中


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

我不确定我是否正确理解了它,但我想您要做的是:

 file_out=io.open("file_Iter" + str(It) + "_V_" +str(V)+".txt", 'w')
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)

请注意命令的结尾,其中文件名是连接在一起的。

$file\u out指的是一个shell变量——执行此命令的shell上下文中的一个变量。但是,
file\u 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
——这是一个更新的模块


另外,您应该知道,根据
V
It
的内容,此shell可能会运行意外命令。假设
V
的值为
'.txt;sudo rm-rf/#'
。现在您的文件名是
'file\u IterIt\u V_uu.txt;sudorm-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命令中输入。

不起作用,因为日期格式会混淆
格式。连接会起作用的,谢谢你指出@njzk2!我已经修好了!:-)谢谢但是我在使用subprocess subprocess.Popen(“echo---------START RUN$(LANG=en_US date+%b_%d_%Y_%k_%M)------| tee-a%s”%(file_out))value错误:索引52V处的格式字符“b”(0x62)不受支持,这里只是数字,我应该提到这一点。@Reza:使用新样式的字符串格式修复了错误。只要你确定它们总是数字,这就可以了,但任何时候你在文件名中使用字符串,你都应该考虑他的。