2014-03-03 103 views
0

我有一個帶有變量名稱(例如V和It)的python腳本。我做基於參數文件名如下:在python中使用tee命令寫入文件

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?

回答

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是級聯的結束。

+0

不起作用,因爲格式會被日期格式弄糊塗。串聯會起作用 – njzk2

+0

感謝您指出@ njzk2!我已經修好了! :-) – Javier

+0

現在的作品!謝謝 – physiker

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

+0

謝謝!但是當我使用subprocess subprocess.Popen(「echo ---------------- START RUN $(LANG = en_US date +%b_%d_%Y_%k_%M) --------- | tee -a%s「%(file_out)) ValueError:索引52處不支持的格式字符'b'(0x62) – physiker

+0

V和這裏只是數字,我應該提到。 – physiker

+0

@Reza:通過使用新風格的字符串格式來修正錯誤。只要你確定它們總是隻有數字,這就沒問題,但是每當你使用字符串作爲文件名時,你應該考慮他的。 –