2012-12-24 55 views
2

打印這檔節目,我有:檢測,如果沒有命令行參數提供

from sys import argv 

script, arg1 = argv 

def program(usr_input, arg1): 
    if(usr_input == arg1): 
     print "CLI argument and user input are identical" 

    else: 
     print "CLI argument and user input aren't identical" 

if arg1 != "": 
    usr_input = raw_input("enter something: ") 
    program(usr_input, arg1) 

else: 
    print "You have not entered a CLI argument at all." 

我得到:

Traceback (most recent call last): 
    File "filename.py", line 3, in <module> 
    script, arg1 = argv 
ValueError: need more than 1 value to unpack 

如何檢測缺乏命令行參數,並拋出錯誤/異常,而不是收到此錯誤?

+4

的argv的只是參數的數組...所以檢查它有多長。 –

+3

考慮一個最小的測試用例:'a,b = [「oops」]'爲什麼這不起作用?如何修復/避免? – 2012-12-24 03:34:07

回答

10

我會建議只是檢查程序ARGS在腳本的__main__位置,作爲入口點到整個應用程序。

import sys 

def program(*args): 
    # do whatever 
    pass 

if __name__ == "__main__": 
    try: 
     arg1 = sys.argv[1] 
    except IndexError: 
     print "Usage: myprogram.py <arg1>" 
     sys.exit(1) 

    # start the program 
    program(arg1) 
+0

謝謝!我更喜歡這個答案。是使用'IndexError'而不是'ValueError'作爲個人選擇還是有重要原因? – Animesh

+0

另外,我認爲代碼末尾的'program(arg1)'不需要縮進。 – Animesh

+1

當索引只有一個元素(在本例中爲1)時,需要IndexError,而不是解包錯誤數量的參數。你只有一個arg,所以我使用了這種方法。還有,縮進是必需的。這是一個用於創建腳本的Python成語,它既可以從另一個腳本導入,也可以作爲可執行文件運行。如果你不縮進最後一行,它會運行代碼,如果你曾經導入這個。 – jdi

1

你可以使用一個try語句有:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import sys 

class MyError(Exception): 
    def __init__(self, value): 
     self.error_string = value 

    def __str__(self): 
     return eval(repr(self.error_string)) 

try: 
    script, arg1 = sys.argv 

except ValueError:  
    raise MyError, "Not enough arguments" 
+2

通常情況下,它只是讓自定義的異常子類只是通過,別無其他。標準庫有大量的描述性例外。但除此之外,我會投票贊成只是在全球空間的簡單方法。嘗試解析參數,並捕獲並打印錯誤並退出。 – jdi

+0

的信息 – 2012-12-24 03:57:03

2

可以處理該異常:

In [6]: def program(argv): 
    try: 
     script, argv1 = argv 
    except ValueError: 
     print("value error handled") 
    ...:   

In [7]: program(argv) 
value error handled 
+0

這是什麼語法@jdi感謝:'[6]'?或者你的意思是「在第6行」或類似的東西? – Animesh

+0

它由ipython解釋器代替>>>。它確實按照順序閱讀。 –

+0

哦!我忘記了能夠在python命令行中編寫函數。 ipython似乎也很酷。謝謝 – Animesh

1

眼看sys.argv是一個列表,你應該檢查列表的長度,以確保它是你希望它是。你有輕微的變化腳本來檢查長度:

from sys import argv 

def program(usr_input, arg1): 
    if(usr_input == arg1): 
     print "CLI argument and user input are identical" 
    else: 
     print "CLI argument and user input aren't identical" 

if len(argv)== 2: 
    arg1 = argv[1] 
    usr_input = raw_input("enter something: ") 
    program(usr_input, arg1) 
else: 
    print "You have not entered a CLI argument at all." 
2

試試這個:

script = argv[0] 
try: 
    arg1 = argv[1] 
except: 
    arg1 = ''