2012-09-27 153 views
0

所以,我遇到了getopt module來解析命令行參數,但我無法理解文檔。 無論出於何種原因,我想不通這是爲什麼不看我--domain example.com說法..解析不讀取所有參數的命令行參數?

$ ./httpdsetup.py -a -u zack --domain example.com 
[('-a', ''), ('-u', '')] 

我打印出來什麼獲取倒入opts,看看它看到的。下面的代碼與文檔站點上的完全相同。

def main(argv): 
     import getopt 

     try: 
       opts, args = getopt.getopt(argv, "h:al:ud:v", ["user=", "apache", "lighttpd", "dir=", "domain=", "vhost="]) 
     except getopt.GetoptError: 
       print_usage() 
       sys.exit(2) 

     username = '' 
     directory = '' 
     domain = '' 

     httpd = 'apache' 

     print(opts) 

     for opt, arg in opts: 
       if opt == '-h': 
         print_usage() 
         sys.exit() 
       elif opt in ('-u', '--username'): 
         username = arg 
       elif opt in ('-d', '--dir'): 
         directory = arg 
       elif opt in ('-v', '--domain', '--vhost'): 
         domain = arg 
       elif opt in ('-a', '--apache'): 
         httpd = 'apache' 
       elif opt in ('-l', '--lighttpd'): 
         httpd = 'lighttpd' 
       else: 
         print_usage() 
         sys.exit() 

     if httpd == 'apache': 
       create_apache_vhost(domain, directory, username) 
     elif httpd == 'lighttpd': 
       create_lighty_vhost(domain, directory, username) 

if __name__ == '__main__': 
     main(sys.argv[1:]) 
+2

不要使用'getopt',使用['argparse'(http://docs.python.org/dev/library/argparse。 HTML)。它更加靈活,並且具有更清晰的IMO接口。 – nneonneo

+0

偶然,你知道Debian軟件包嗎? – Zack

+0

儘管在Debian Squeeze上安裝了「python-argparse」軟件包,但我在導入模塊'argparse'上收到了ImportError。 – Zack

回答

1

我更喜歡​​。 Python documention here。 它在Python> = 2.7和> = 3.2中,但不在Python 3.0和3.1中。如果您的安裝中缺少它,只需將the single file from here複製到您的腳本所在的位置,或者複製到您的Python安裝中。

下面是與​​一些接近你的例子:

#!/usr/bin/env python3 

import sys 



def create_apache_vhost(*args, **kwargs): 
    pass 

def create_lighty_vhost(*args, **kwargs): 
    pass 

def main(argv): 
     import argparse 

     parser = argparse.ArgumentParser(description="Some server", 
             formatter_class=argparse.RawDescriptionHelpFormatter) 

     parser.add_argument('--username', type=str) 
     parser.add_argument('-u', dest='username', type=str) 

     parser.add_argument('--apache', dest='httpd', action='store_const', const='apache') 
     parser.add_argument('-a',  dest='httpd', action='store_const', const='apache') 
     parser.add_argument('--lighthttpd', dest='httpd', action='store_const', const='lighthttpd') 
     parser.add_argument('-l',   dest='httpd', action='store_const', const='lighthttpd') 

     parser.add_argument('--domain', type=str) 
     parser.add_argument('--vhost', type=str) 
     parser.add_argument('-v', dest='domain', type=str) 

     parser.add_argument('--dir', dest='directory', type=str) 
     parser.add_argument('-d', dest='directory', type=str) 

     defaults = { 
      'httpd': 'apache', 
      } 
     parser.set_defaults(**defaults) 

     args = parser.parse_args(args=argv) 

     print(args) 

     if args.httpd == 'apache': 
       create_apache_vhost(args.domain, args.directory, args.username) 
     elif args.httpd == 'lighttpd': 
       create_lighty_vhost(args.domain, args.directory, args.username) 

if __name__ == '__main__': 
     main(sys.argv[1:]) 
+0

謝謝!儘管如此,我仍然對Python非常陌生。是** ** kwargs(和其他星號變量)指針數組? o.O對C++有一種模糊的理解,因爲我大多是C#開發人員。 – Zack

+0

附註:我似乎無法找到Debian Squeeze上的argparse工作包(不提供ImportError)。 – Zack

+0

Python中的所有東西都是引用,所以沒有指針。 '* args'和'** kwargs'類似於C的'varargs',因爲它們擁有可選的參數。一個'*'是位置的,兩個'**'被命名爲參數。 – cfi