2011-04-05 80 views
0

我已經編寫了一個python程序來與一個已編譯的程序(稱爲ProgramX)進行交互,該程序有一些難以處理的特性。我需要通過我的python程序將數千個輸入文件提供給ProgramX。我想要做的是獲取每次運行時由ProgramX創建的輸出文件,並將其重命名爲inputfilename.output。從Python Popen進程中抓取輸出文件?

問題出現在由ProgramX編寫的輸出文件中 - 它是通過一種不可預知的方法命名的,它將寫入輸出文件並「無情地覆蓋」它(如果已經存在)的時間)。節約寬限可能伴隨着輸出文件有一個標準前綴的事實:think ProgramX.notQuiteRandomNumber。

唯一想我能想到做的就是這樣的事情在我的bash shell:

PROGRAMXOUTPUT=$(ls -ltr ProgramX* | tail -n -1 | awk '{print $8}') 
mv $PROGRAMXOUTPUT input.output 

這確實90%的我需要什麼,但在此之前我編程一切慶典爲一系列POPEN語句, 有一個更好的方法嗎?這個問題感覺像人們可能會有比我想象的更好的解決方案。

旁註:我可以抓住程序的標準輸出沒有問題,但它是我需要抓取的輸出文件。

獎勵:我打算在同一個目錄下運行一堆程序實例,所以我上面的天真方法可能會出現無法預料的問題。因此,也許有些幻想看到ProgramX的PID並遵循它的輸出。

回答

2

要怎麼做你上面的shell腳本呢,假設你只在當前目錄下有一個ProgramX*

import glob, os 

programxoutput = glob.glob('ProgramX*')[0] 
os.rename(programxoutput, 'input.output') 

如果您需要按時間等進行排序,也有辦法做到這一點(查看os.stat),但使用最近的修改日期是一個討厭的競賽條件,如果你將運行多個副本ProgramX同意TLY。

我會建議您改爲創建並更改爲每次運行ProgramX的新臨時目錄,這樣運行時就不可能彼此踩踏。 tempfile模塊可以幫助解決這個問題。

0

如果只有一個ProgramX*文件,然後怎麼樣只是:

mv ProgramX* input.output 
2

兩個選項,我看到:

  1. 你可以使用lsof的發現打開的文件發現,ProgramX被寫入文件。
  2. 另一種方法是在臨時目錄中運行ProgramX(請參閱tempfile以獲取設置目錄的簡單方法。在ProgramX的運行之間,可以清理該目錄或繼續請求新的臨時目錄,如果您計劃運行多個copieProgramX在同一時間。