2012-01-27 130 views
26

我剛剛開始使用python,所以我正在用一個很簡單的例子掙扎。基本上我想傳遞一個可執行文件的名稱加上通過命令行參數的輸入,例如:Python命令行參數

python myprogram refprogram.exe refinput.txt 

執行myprogram時,它執行refprogram.exe這意味着和傳遞給它作爲參數refinput。我試着做以下方式:

import sys, string, os 
print sys.argv 

res = os.system(sys.argv(1)) sys.argv(2) 
print res 

的錯誤消息,我得到的是:

res = os.system(sys.argv(1)) sys.argv(2) 
         ^
SyntaxError: invalid syntax 

任何一個知道我做錯了嗎?

我正在運行的Python 2.7

+3

我希望我的電腦會給我一個錯誤按摩。 :-) – LarsH 2013-12-17 16:03:50

回答

61

此行

res = os.system(sys.argv(1)) sys.argv(2) 

是錯誤的幾種方法。

首先,sys。argv的是一個列表,讓你用方括號來訪問其內容:

sys.argv[1] 
sys.argv[2] 

其次,你得太早收出上os.system你的括號,並sys.argv(2)留掛它的結束。在所有參數之後,您要將右括號移到行的最後。

第三,你需要用逗號分隔參數,一個簡單的空格不會。

你的最後一行應該是這樣的:

res = os.system(sys.argv[1], sys.argv[2]) 
8

sys.argv是一個列表,並使用方括號,例如址變sys.argv[1]。編制索引之前,您可能還需要檢查len(sys.argv)。另外,如果您想將參數傳遞給os.system(),您可能需要類似os.system(' '.join(sys.argv[1:]))的東西,但這對帶空格的參數不起作用。你最好使用子進程模塊。

3

sys.argv中是一個列表

import sys, string, os 
print sys.argv 

res = os.system(sys.argv[1]) sys.argv[2] 
print res 
1

如果你正在運行的Python 2.7,建議使用新的subprocess模塊。

在這種情況下,你會寫

import sys, subprocess 
result = subprocess.check_output(sys.argv[1], sys.argv[2]) 
29

一個遠遠更好的方式來做到這一點是與argparse libraryenvoy wrapper庫使得subprocess也更容易使用。

一個簡單的例子:

import argparse 
import envoy 

def main(**kwargs): 
    for key, value in kwargs.iteritems(): 
     print key, value 
    cmd = '{0} {1}'.format(kwargs['program'], ' '.join(kwargs['infiles'])) 
    r = envoy.run(cmd) 
    print r.std_out 
    print r.std_err 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description='Get a program and run it with input', version='%(prog)s 1.0') 
    parser.add_argument('program', type=str, help='Program name') 
    parser.add_argument('infiles', nargs='+', type=str, help='Input text files') 
    parser.add_argument('--out', type=str, default='temp.txt', help='name of output file') 
    args = parser.parse_args() 
    main(**vars(args)) 

此讀取的參數,解析它們,然後將它們發送到主方法關鍵字和值的字典。通過傳入預構造的字典,可以獨立於參數代碼測試主方法。

主要方法打印出關鍵字和值。然後它創建一個命令字符串,並將其傳遞給特使運行。最後,它打印命令的輸出。

如果您安裝了pip,可以使用pip install envoy安裝envoy。最簡單的方法是使用pip-installer

+2

同意一般(argparse是真棒),但對於初學者的無限腳本,它可能是矯枉過正。 – delnan 2012-01-27 15:58:09

+3

@delnan它解決了很多問題,我認爲最好是咬住子彈並學習它。我還在使用'envoy'而不是'os.command'上添加了一些內容,因爲我在原始問題中錯過了這個。 – 2012-01-27 16:10:35

+4

它從來沒有矯枉過正。實用程序腳本有一種成爲永久性生產功能的方法。 – 2012-01-27 16:39:54