2009-02-20 33 views
23

Điều gì sẽ là một biểu thức dễ dàng để xử lý các đối số dòng lệnh nếu tôi mong đợi bất cứ điều gì như 001 hoặc 999 (chúng ta hãy giới hạn kỳ vọng 001 ... khoảng 999 cho thời gian này), và vài đối số khác được thông qua, và muốn bỏ qua bất ngờ?Làm cách nào để xử lý các đối số dòng lệnh bằng Python?

Tôi hiểu rằng nếu ví dụ tôi cần phải tìm hiểu xem "debug" đã được thông qua giữa các thông số đó sẽ là một cái gì đó như thế:

if 'debug' in argv[1:]: 
    print 'Will be running in debug mode.' 

Làm thế nào để tìm hiểu xem 009 hoặc 575 đã được thông qua?

Tất cả cuộc gọi những người đang mong đợi:

python script.py 
python script.py 011 
python script.py 256 debug 
python script.py 391 xls 
python script.py 999 debug pdf 

Tại thời điểm này tôi không quan tâm về các cuộc gọi như thế:

python script.py 001 002 245 568 
python script.py some unexpected argument 
python script.py 0001 
python script.py 02 

... đầu tiên một - vì nhiều hơn một "số " tranh luận; thứ hai - vì ... tốt, các đối số bất ngờ; thứ ba và thứ tư - vì các đối số không phải 3 chữ số.

+0

kiểm tra ra này một http://stackoverflow.com/questions/25605380/passing-directory-to-python-script-as-command-line-argument/25605529#25605529 –

Trả lời

29

Như những người khác đã trả lời, optparse là lựa chọn tốt nhất, nhưng nếu bạn chỉ muốn mã nhanh chóng thử một cái gì đó như thế này:

import sys, re 

first_re = re.compile(r'^\d{3}$') 

if len(sys.argv) > 1: 

    if first_re.match(sys.argv[1]): 
     print "Primary argument is : ", sys.argv[1] 
    else: 
     raise ValueError("First argument should be ...") 

    args = sys.argv[2:] 

else: 

    args =() 

# ... anywhere in code ... 

if 'debug' in args: 
    print 'debug flag' 

if 'xls' in args: 
    print 'xls flag' 

EDIT: Dưới đây là một ví dụ optparse vì rất nhiều người đang trả lời optparse mà không thực sự giải thích lý do tại sao, hoặc giải thích những gì bạn phải thay đổi để làm cho nó hoạt động.

Lý do chính để sử dụng optparse là nó mang lại cho bạn sự linh hoạt hơn để mở rộng sau này và mang lại cho bạn sự linh hoạt hơn trên dòng lệnh. Nói cách khác, các tùy chọn của bạn có thể xuất hiện theo bất kỳ thứ tự và tin nhắn sử dụng nào được tạo tự động. Tuy nhiên để làm cho nó hoạt động với optparse, bạn cần phải thay đổi các thông số của bạn để đặt '-' hoặc '-' trước đối số tùy chọn và bạn cần cho phép tất cả các đối số theo thứ tự bất kỳ.

Vì vậy, đây là một ví dụ sử dụng optparse:

import sys, re, optparse 

first_re = re.compile(r'^\d{3}$') 

parser = optparse.OptionParser() 
parser.set_defaults(debug=False,xls=False) 
parser.add_option('--debug', action='store_true', dest='debug') 
parser.add_option('--xls', action='store_true', dest='xls') 
(options, args) = parser.parse_args() 

if len(args) == 1: 
    if first_re.match(args[0]): 
     print "Primary argument is : ", args[0] 
    else: 
     raise ValueError("First argument should be ...") 
elif len(args) > 1: 
    raise ValueError("Too many command line arguments") 

if options.debug: 
    print 'debug flag' 

if options.xls: 
    print 'xls flag' 

Sự khác biệt ở đây với optparse và spec của bạn là bây giờ bạn có thể có những dòng lệnh như:

python script.py --debug --xls 001 

và bạn có thể dễ dàng thêm các tùy chọn mới bằng cách gọi đến parser.add_option()

+4

nhưng lưu ý: optparse đã bị "không dùng nữa kể từ [Python] phiên bản 2.7: Mô-đun optparse không được dùng nữa và sẽ không được phát triển thêm; phát triển sẽ tiếp tục với mô-đun argparse". Xem: http://docs.python.org/2/library/optparse.html – kkurian

15

Hãy xem mô-đun optparse. Đối phó với sys.argv mình là tốt cho các công cụ thực sự đơn giản, nhưng nó được ra khỏi tay một cách nhanh chóng.

Lưu ý rằng bạn có thể thấy khó phân biệt dễ sử dụng hơn nếu bạn có thể thay đổi định dạng đối số một chút; ví dụ. thay thế debug bằng --debugxls bằng --xls hoặc --output=xls.

+0

Tôi không chắc chắn này là đáng giá khi OP chỉ sử dụng đối số, không phải tùy chọn. –

+4

Lưu ý rằng optparse đã được thay thế bằng [argparse] (http://docs.python.org/library/argparse.html#module-argparse) –

2

optparse là người bạn tốt nhất của bạn để phân tích cú pháp dòng lệnh. Xem thêm argparse; tuy nhiên nó không nằm trong thư viện chuẩn.

+2

Giống như một lưu ý [argparse] (http://docs.python.org /2.7/library/argparse.html) bây giờ là tiêu chuẩn trong Python 2.7 và thậm chí dường như đã được chuyển đến 2.6.8. Theo [tài liệu optparse] (http://docs.python.org/2/library/optparse.html), tính năng chọn tham gia hiện không còn được dùng nữa. –

2

Nếu bạn muốn triển khai các công tắc dòng lệnh thực tế, hãy cung cấp giao diện getopt. Nó cũng rất dễ sử dụng.

+0

Tôi sẽ không nói getopt là tất cả những gì đơn giản - chắc chắn, nó tốt hơn làm phân tích cú pháp theo cách thủ công, nhưng nó chỉ là một cổng của một số mã C điều đó thực sự không tận dụng được điểm mạnh của Python. Tôi gần như luôn luôn khuyên bạn nên optparse qua getopt. –

0

Van Gale phần lớn là chính xác trong việc sử dụng cụm từ thông dụng đối với đối số. Tuy nhiên, KHÔNG nhất thiết phải chọn mọi thứ khi sử dụng optparse, nó tách sys.argv thành các tùy chọn và đối số, dựa trên việc liệu "-" hay "-" có ở phía trước hay không. Một số mã ví dụ đi qua chỉ là đối số:

import sys 
import optparse 

claParser = optparse.OptionParser() 
claParser.add_option(
(opts, args) = claParser.parse_args() 
if (len(args) >= 1): 
    print "Arguments:" 
    for arg in args: 
    print " " + arg 
else: 
    print "No arguments" 
sys.exit(0) 

Vâng, mảng args được phân tách nhiều cách tương tự như sys.argv sẽ, nhưng khả năng dễ dàng thêm các tùy chọn nếu cần thiết đã được thêm vào. Để biết thêm về optparse, hãy xem relevant Python doc.

Các vấn đề liên quan