2012-04-10 31 views
0

我正在寫在一個循環中執行一系列操作的Python腳本,通過使子進程調用,就像這樣:使用python子不可預知的行爲叫

os.system('./svm_learn -z p -t 2 trial-input model') 
os.system('./svm_classify test-input model pred') 
os.system('python read-svm-rank.py') 
score = os.popen('python scorer.py -g gold-test -i out').readline() 

當我打的電話分別一前一後其他在外殼中他們工作得很好。但在腳本內,它們總是破裂。我追蹤了錯誤的來源,並且似乎輸出文件在最後被截斷(導致我相信正在進行的調用沒有完成)。

我試着用subprocess.Popen,然後使用Popen對象的wait()方法,但無濟於事。腳本仍然中斷。

任何想法這裏發生了什麼?

+0

'os.system'和'subprocess.call'都等待系統調用完成後才返回。如果您需要幫助調試您的程序,我們將需要更多信息。 'os.system('python read-svm-rank.py')'看起來對我來說是高度懷疑的,是否有可能從read-svm-rank.py中導入你需要的東西? – 2012-04-10 21:39:32

+1

你的文件是否在任何機會的遠程文件系統(如NFS)? – amcnabb 2012-04-10 21:45:40

+0

用戶實際上解決了他們自己的問題,並將他們的解決方案作爲對已刪除答案的評論發佈。這是由於文件未被關閉造成的,因此不會刷新到磁盤。 – agf 2012-04-11 04:38:21

回答

0

我可能會首先重寫一點,以使用子進程模塊,而不是os模塊。

然後我可能會審視什麼是通過研究一個系統調用跟蹤腳麻: http://stromberg.dnsalias.org/~strombrg/debugging-with-syscall-tracers.html

希望就會有接近文件末尾的「E」的錯誤代碼,會告訴你什麼錯誤正在遭遇。

另一種選擇是將子流程的子集註釋掉(假設第n + 1個不依賴於第n個輸出),來確定哪個子流程存在問題。之後,您可以在違規腳本中添加一些額外的錯誤報告,看看它在做什麼。

但是,如果你不被C-ISH系統調用的痕跡拖延,那可能會更容易。

+0

用戶實際上解決了他們自己的問題,並將他們的解決方案作爲對已刪除答案的評論發佈。這是由於文件未被關閉造成的,因此不會刷新到磁盤。 – agf 2012-04-11 04:32:15