在Python中使用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 个回答
$file_out
是一个 shell 变量,也就是在你执行这个命令的环境中用到的变量。而 file_out
则是你 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
,因为 subprocess
是一个更新的模块,是为了替代 os.system
而设计的。
另外,你还需要注意,根据 V
和 It
的内容,可能会导致 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 命令中 对文件名进行转义。
我不太确定我理解得对不对,但我想你想做的事情是这样的:
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)
注意命令的最后部分,那里有文件名被连接在一起。