2014-03-29 97 views
1

我想從python運行程序並查找其內存使用情況。要做到這一點,我使用:使用subprocess.Popen()或subprocess.check_call()時程序被卡住

l=['./a.out','<','in.txt','>','out.txt'] 
p=subprocess.Popen(l,shell=False,stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
p.wait() 
Res= getrusage(resource.RUSAGE_CHILDREN) 
print Res.ru_maxrss 

我還試圖用check_call(l,shell=False,stdout = subprocess.PIPE, stderr = subprocess.PIPE)和刪除p.wait但問題是程序卡住在p.wait()使用check_call在使用POPEN和check_call()時() 。我無法弄清楚爲什麼會發生這種情況。我的論證列表錯了嗎?

命令./a.out <in.txt> out.txt在終端上工作正常。我正在使用Ubuntu

回答

2

有兩個問題(至少):

  1. <>重定向由殼處理。 subprocess不產卵默認外殼(你也不應該)
  2. 如果stdout=PIPEstderr=PIPE,則必須從管道讀,否則該過程可能永遠阻塞

爲了從文件中讀取一個子進程並寫入文件:

from subprocess import check_call, STDOUT 

with open('in.txt') as file, open('out.txt', 'w') as outfile: 
    check_call(["./a.out"], stdin=file, stdout=outfile, stderr=STDOUT) 

stderr=STDOUT合併stdout,stderr。

+0

好吧,我知道了...我知道我的下一個問題是關閉主題,但我用來計算正在執行的程序的內存使用情況的方案沒有返回正確的答案。我想知道如何獲得最大內存使用量。 – user2179293

+0

[subprocess.Popen跨平臺資源使用](http://stackoverflow.com/q/22715059/4279) – jfs

+0

我試過使用psutil,但我有一個疑問。如果進程在到達'psutil.Process(p.pid)'前結束,那麼會發生什麼。有時輸出(rss = 0,vms = 0)出現什麼意思?但在隨後的運行中,它顯示幾乎正確的內存使用情況。 – user2179293

1

您在調用中使用了shell重定向字符,但是當您使用subprocess並設置shell=False時,必須手動處理這些管道。 您似乎將這些重定向字符直接作爲參數傳遞給a.out程序。 嘗試在你的shell中運行此:

./a.out '<' in.txt '>' out.txt 

看看a.out終止然後爲好。

+0

'./a.out out.txt'在終端 – user2179293

+0

@ user2179293上正常工作,我在原始問題中沒有看到這一點,這要歸功於我的注意。我現在編輯了答案,請看看。 – Denis

+0

好吧,我知道它的輸入沒有被重定向。我如何重定向我的輸入?我不想使用'shell = True',因爲在計算內存使用情況時,程序會計算shell的內存使用情況,而不是'shell = True'的程序的內存使用情況。 – user2179293