2012-07-11 216 views
0

我試圖通過Python腳本在終端中運行命令。該命令只需要三個參數,在終端中執行時可以完美工作。以下是在命令行中輸入:在Python腳本中運行終端

gpmetis inputfile numberOfSections 

無論在inputfile是從,說桌面時,outputfile被執行gpmetis(它被命名爲inputfile.part.numberOfSections)後傾倒在相同的位置。 gpmetis只適用於終端,但出於凝聚的目的,我希望在Python腳本的中間使用它來節省時間。 (我以前只是將文件拖入終端和Python文件)

但是,這是我遇到問題......這questionforum提供了有關如何在Python中執行終端有用的提示,但我當我運行python代碼時仍然沒有收到outputfile。這就像輸出被抑制或我呼叫終端的方式有問題。

我正在呼叫的終端,如:

def Terminal(inputfile, NumParts): 
    os.system("gpmetis inputfile NumParts") 

    outputfile = "inputfile.part." + NumParts 
    return outputfile 

而且我不從此得到一個錯誤,但我沒有收到任何輸出文件要麼。我在這裏錯過了什麼,如果你知道你能解釋它嗎?我正在努力學習Python,所以描述我搞砸了什麼將是非常感激。

os已導入。在我的腳本中「退回」outputfile的方式可能存在問題,但我的桌面上也看不到outputfile,這是要處理的第一個問題(一次一個步驟!)

注:我發現這是相關的documentation,但它會幫助我嗎?我無法理解它。

回答

4

首先,您可能會檢查返回值os.system。非零返回值通常表示發生了錯誤。

它看起來像你試圖在你的命令中使用參數。在這種情況下,它應該是這樣的:

def Terminal(inputfile, NumParts): 
    command = 'gpmetis ' + inputfile + ' ' + str(NumParts) 
    os.system(command) 

    outputfile = intputfile + '.part.' + str(NumParts) 
    return outputfile 

最後,基於this答案,它看起來像您可以使用subprocess模塊會更好。然後你可以像這樣執行相同的命令:

import subprocess 
subprocess.call(['gpmetis', inputfile, str(NumParts)]) 
+0

真棒!這工作完美。我應該使用'os.system'還是'subprocess'有區別? – Ason 2012-07-11 23:46:50

+1

是的。你應該總是使用'subprocess' - 'os.system'的文檔甚至建議這樣做。 – kindall 2012-07-12 00:05:06

+0

在Python 2.4中增加了'subprocess'來替換舊的模塊/函數,包括os.system。使用'os.system'進行調用要簡單一些,但要以降低功能爲代價。 'subprocess'允許更好的錯誤處理和更多的選項(比如管道),特別是如果你使用完整的'subprocess.Popen'對象。你可以在這裏閱讀更多關於它的內容:http://docs.python.org/library/subprocess.html – 2012-07-12 00:12:28

0

這裏inputfile是一個傳遞給函數的變量,但在命令行參數中,它被當作文件名。

你可能想嘗試

os.system('gpmetis ' + str(inputfile) + ' ' + str(NumParts)) 
outputfile = intputfile + '.part.' + str(NumParts) 

這是很難不調用代碼和意圖說。讓我知道它是否有幫助。

+0

'outputfile'仍然沒有顯示出來。我注意到,你把''''放在兩個字符串之間,它是否應該在''gpmetis''和'str(inputfile)'之間? – Ason 2012-07-11 23:40:45

+0

我試圖通過連接命令和參數來獲取inputfile變量並形成命令。然後我將命令傳遞給os.system()調用。 – 2012-07-11 23:44:39

+0

好..感謝您的解釋!它仍然沒有工作,但這是有道理的。 – Ason 2012-07-11 23:45:52