在python中有乙個庫叫做getopt,專門用來處理命令列選項。首先假設乙個命令為
./justforsample -c -b 5 --mm --lala /home第乙個返回值為在上面的命令中sys.argv中存的分別是['./justforsample','-c','-b','5','--mm','--lala','/home'],其中把『-c'代表不需要附加引數的短選項;'-b'代表需要附加引數的短選項,同時5就是其附加引數;'--mm'代表不需要附加引數的長選項;』--lala'代表需要附加引數的長選項,同時/home就是其附加引數。
getopt函式的格式是getopt.getopt(命令列引數,"短選項",[長選項])
其中如果短選項需要附加引數則在短選項後面加:,如果長選項需要新增引數則在長選項後新增=。返回值有兩個,乙個是對應的引數選項和value元組,另乙個是除去有用引數外的其他命令列輸出。
上面例子對應的格式為
getopt.getopt(sys.argv[1:],'cb:',['mm','
lala
='])
[('-c', ''), ('-b', '5'), ('--mm', ''), ('--lala', '/home')] ,第二個返回值為空。
1. 匯入getopt, sys 模組
2. 分析命令列引數
3. 處理結果
第一步很簡單,只需要:
import getopt, sys
第二步處理方法如下(以python 手冊上的例子為例):
python**
try:
opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])
except getopt.getopterror:
# print help information and exit:
1. 處理所使用的函式叫getopt() ,因為是直接使用import 匯入的getopt 模組,所以要加上限定getopt 才可以。
2. 使用sys.argv[1:] 過濾掉第乙個引數(它是執行指令碼的名字,不應算作引數的一部分)。
3. 使用短格式分析串"ho:" 。當乙個選項只是表示開關狀態時,即後面不帶附加引數時,在分析串中寫入選項字元。當選項後面是帶乙個附加引數時,在分析串中寫入選項字元同時後面加乙個":" 號 。所以"ho:" 就表示"h" 是乙個開關選項;"o:" 則表示後面應該帶乙個引數。
4. 使用長格式分析串列表:["help", "output="] 。長格式串也可以有開關狀態,即後面不跟"=" 號。如果跟乙個等號則表示後面還應有乙個引數 。這個長格式表示"help" 是乙個開關選項;"output=" 則表示後面應該帶乙個引數。
5. 呼叫getopt 函式。函式返回兩個列表:opts 和args 。opts 為分析出的格式資訊。args 為不屬於格式資訊的剩餘的命令列引數。opts 是乙個兩元組的列表。每個元素為:( 選項串, 附加引數) 。如果沒有附加引數則為空串'' 。
6. 整個過程使用異常來包含,這樣當分析出錯時,就可以列印出使用資訊來通知使用者如何使用這個程式。
如上面解釋的乙個命令列例子為:
'-h -o file --help --output=out file1 file2'
在分析完成後,opts 應該是:
[('-h', ''), ('-o', 'file'), ('--help', ''), ('--output', 'out')]
而args 則為:
['file1', 'file2']
第三步主要是對分析出的引數進行判斷是否存在,然後再進一步處理。主要的處理模式為:
python**
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-o", "--output"):
output = a
使用乙個迴圈,每次從opts 中取出乙個兩元組,賦給兩個變數。o 儲存選項引數,a 為附加引數。接著對取出的選項引數進行處理。(例子也採用手冊的例子)
實踐篇:
python**
#!/usr/bin/env python
import sys;
import getopt;
def usage():
print("usage:%s [-a|-o|-c] [--help|--output] args...." %dsys.argv[0]);
if"__main__" == __name__:
#lsargs = [""];
try:
opts,args = getopt.getopt(sys.argv[1:], "ao:c", ["help", "output="]);
print("**********== opts ***************===");
print(opts);
print("**********== args ***************===");
print(args);
#check all param
for opt,arg in opts:
if opt in ("-h", "--help"):
usage();
sys.exit(1);
elif opt in ("-t", "--test"):
print("for test option");
else:
print("%s ==> %s" %(opt, arg));
except getopt.getopterror:
print("getopt error!");
usage();
sys.exit(1);
執行結果:
$ ./test_getopt.py -a -oaaa -caa --output=out file1 t file2 -d
**********== opts ***************===
[('-a', ''), ('-o', 'aaa'), ('-c', ''), ('-a', ''), ('-a', ''), ('--output', 'out')]
**********== args ***************===
['file1', 't', 'file2', '-d']
-a ==>
-o ==> aaa
-c ==>
-a ==>
-a ==>
--output ==> out
python 之 分割引數getopt
from python 之 分割引數getopt os下有個方法walk,非常的好用,用來生成乙個generator。每次可以得到乙個三元tupple,其中第乙個為起始路徑,第二個為起始路徑下的資料夾,第三個是起始路徑下的檔案。1.匯入getopt,sys 模組 2.分析命令列引數 3.處理結果 第...
python 之 分割引數getopt
os下有個方法walk,非常的好用,用來生成乙個generator。每次可以得到乙個三元tupple,其中第乙個為起始路徑,第二個為起始路徑下的資料夾,第三個是起始路徑下的檔案。1.匯入getopt,sys 模組 2.分析命令列引數 3.處理結果 第一步很簡單,只需要 import getopt,s...
python中處理命令列引數命令getopt
os下有個方法walk,非常的好用,用來生成乙個generator。每次可以得到乙個三元tupple,其中第乙個為起始路徑,第二個為起始路徑下的資料夾,第三個是起始路徑下的檔案。1.匯入getopt,sys 模組 2.分析命令列引數 3.處理結果 第一步很簡單,只需要 import getopt,s...