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

0 投票
2 回答
1457 浏览
提问于 2025-04-17 20:37

我有一个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

$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 而设计的。

另外,你还需要注意,根据 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 命令中 对文件名进行转义

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)

注意命令的最后部分,那里有文件名被连接在一起。

撰写回答