2012-10-25 38 views
1

我很新的蟒蛇。我希望我可以實現通過python作爲我的第一個python腳本的命令行參數。我寫了下面的代碼:實施ARG通過命令行的python的,不工作

def main(argv): 
    try: 
     opts, args = getopt.getopt(argv, "hb:b:f", ["help", "bucket=", "folder"]) 
    except getopt.GetoptError: 
     usage() 
     sys.exit(2) 
    s3 = get_files() 
    for opt, arg in opts: 
     if opt in ("-h", "--help"): 
      usage() 
      sys.exit() 
     elif opt in ("-b", "--bucket"): 
      s3.bucketname = arg 
     elif opt in ("-f", "--folder"): 
      s3.foldername = arg 
      print("Came here" + s3.foldername) 
    s3.download_files() 

-f命令的參數是我面臨的問題。爲了調試,我使用了print聲明。我傳遞參數是這樣的:

./hello -b something -f /path 

但遺憾的是它打印出:

Came here 

foldername屬性沒有得到分配任何價值。我犯了什麼錯誤?

在此先感謝。

+2

我建議使用[argparse](http://docs.python.org/library/argparse.html)([教程](http://docs.python.org/howto/argparse.html)),用於命令行參數解析這將使您的任務更容易。 –

+0

但是,爲什麼不工作!它在'elif'語句中捕捉我的'-f'參數。但沒有得到分配給我的'foldername' – sriram

+0

在您發佈的例子縮進不正確。你需要解決這個問題。請記住,在Python中,縮進是語言語法的一部分。 –

回答

2

Argparse真的是解決這樣的

import argparse 

if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-b', '--bucket', dest='bucketname', action='store') 
    parser.add_argument('-f', '--folder', dest='folder', action='store') 
    args = parser.parse_args('-b foo'.split()) 
    print args 
    args = parser.parse_args('-b foo -f /foo'.split()) 
    print args 

問題的一個更簡單的方法,得出:

> Namespace(bucketname='foo', folder=None) 
> Namespace(bucketname='foo', folder='/foo') 

這意味着你可以重寫你的函數爲:

import sys 
import argparse 

def main(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-b', '--bucket', dest='bucketname', action='store') 
    parser.add_argument('-f', '--folder', dest='folder', action='store') 
    args = parser.parse_args() 
    s3 = get_files() 
    s3.foldername = args.folder 
    s3.download_files() 

沒有任何進一步的工作,script.py --help輸出爲:

usage: script.py [-h] [-b BUCKETNAME] [-f FOLDER] 

optional arguments: 
    -h, --help   show this help message and exit 
    -b BUCKETNAME, --bucket BUCKETNAME 
    -f FOLDER, --folder FOLDE 
+0

謝謝。在這種情況下,我將如何找到意想不到的論點?並向用戶提供幫助信息? – sriram

+0

感謝您注意到它會自動創建幫助信息!非常感謝。 – sriram

2

你忘記了「文件夾」後的等號,應該是getopt.getopt(argv, "hbf:", ["help", "bucket=", "folder="]),對不對?

你的縮進是不正確的,應該引起語法錯誤。它應該是:

​​

正如其他人指出的那樣,argparse很好。