2009-10-07 33 views
6

Theo tài liệu về số getopt của python (tôi nghĩ) các trường tùy chọn sẽ hoạt động như chức năng getopt(). Tuy nhiên tôi dường như không thể cho phép các thông số tùy chọn để mã của tôi:Có cách nào để thuyết phục getopt của python để xử lý các tham số tùy chọn cho các tùy chọn không?

#!/usr/bin/python 
import sys,getopt 

if __name__ == "__main__": 
    try: 
     opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="]) 
    except getopt.GetoptError, err: 
     print str(err) 
     sys.exit(1) 

    for o,a in opts: 
     if o in ("-v", "--verbose"): 
      if a: 
       verbose=int(a) 
      else: 
       verbose=1 
      print "verbosity is %d" % (verbose) 

Kết quả trong:

$ ./testopt.py -v 
option -v requires argument 
$ ./testopt.py -v 1 
verbosity is 1 

Trả lời

8

getopt không hỗ trợ các thông số tùy chọn. trong trường hợp tùy chọn dài bạn có thể thực hiện:

$ ./testopt.py --verbose= 

sẽ dẫn đến giá trị chuỗi rỗng.

Bạn có thể tìm thấy mô-đun argparse linh hoạt hơn.

5

Thật không may, không có cách nào. Từ số optparse docs:

Thông thường, một tùy chọn nhất định có tranh luận hoặc không. Rất nhiều người muốn có một tính năng "tùy chọn đối số tùy chọn", có nghĩa là một số tùy chọn sẽ đưa ra một đối số nếu họ nhìn thấy nó và sẽ không xảy ra nếu không. Điều này có phần gây tranh cãi, bởi vì nó làm cho việc phân tích không rõ ràng: nếu "-a" nhận một đối số tùy chọn và "-b" là một tùy chọn khác, cách chúng ta diễn giải "-ab"? Vì sự mơ hồ này, optparse không hỗ trợ tính năng này.

EDIT: oops, đó là cho các mô-đun optparse không module getopt, nhưng lý do tại sao không có mô-đun "đối số tùy chọn không bắt buộc" là như nhau cho cả hai.

+0

đó là tài liệu optparse;) – SilentGhost

+0

Yeah Tôi chỉ nhận thấy rằng, trường hợp cổ điển của "tab sai "hội chứng. Tuy nhiên, tôi vẫn nghĩ rằng lý do này là tương đối cho getopt quá. –

+0

Ngoài ra, các tùy chọn dài có thể có các đối số tùy chọn một cách rõ ràng; "--foo" so với "--foo = arg". Python không xuất hiện để hỗ trợ điều này, mà là rất nghèo; một triệu chứng của nửa chừng reimplementing một cái gì đó từ đầu ... –

0

Nếu bạn đang sử dụng phiên bản 2.3 hoặc mới hơn, bạn có thể thử mô-đun optparse thay vì, "tiện lợi, linh hoạt và mạnh mẽ hơn ...", cũng như mới hơn. Than ôi, như Pynt trả lời, có vẻ như không thể có được chính xác những gì bạn muốn.

+0

ngoại trừ từ 'optparser' docs được đăng bởi Pynt cách đây 45 phút! – SilentGhost

+0

@SilentGhost: Trong bài đọc của tôi về câu trả lời của Pynt, tôi thấy không có gì giới thiệu optparse hơn get_opt, đó là những gì tôi đã nhận được tại. Phải thừa nhận rằng, tôi đã không giải thích rằng ban đầu, nhưng đã chỉnh sửa để làm như vậy. – PTBNL

+0

optparse đặc biệt nói rằng nó không hỗ trợ các tham số tùy chọn cho các tùy chọn. – stsquad

2

Bạn có thể làm một tham số tùy chọn với getopt như thế này:

import getopt 
import sys 

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env=']) 
argDict = dict(longopts) 

if argDict.has_key('--env') and argDict['--env'] == 'prod': 
    print "production" 
else: 
    print "sandbox" 

Cách sử dụng: getopt

$ python scratch.py --env=prod 
production 

$ python scratch.py --env=dev 
sandbox 

$ python scratch.py 
sandbox 
0

python thực sự cần hỗ trợ args tùy chọn, như GNU getopt bằng cách yêu cầu '=' được sử dụng khi chỉ định tham số. Bây giờ bạn có thể mô phỏng nó khá dễ dàng, mặc dù, với ràng buộc này bằng cách thay đổi hoàn toàn --chuyển thành --option =

I.E. bạn có thể chỉ định --tùy chọn mà đòi hỏi một cuộc tranh cãi, và sau đó điều chỉnh --tùy chọn cho --tùy chọn = như sau:

for i, opt in enumerate(sys.argv): 
    if opt == '--option': 
     sys.argv[i] = '--option=' 
    elif opt == '--': 
     break 
Các vấn đề liên quan