2012-02-25 27 views
9
from sys import argv 
script, lira_cbt, [eur_hedge] = argv 

if eur_hedge == None: 
    #Do x 
else: 
    #Do y 

Tôi muốn nó có thể chạy chỉ với lira_cbt làm đối số (làm x), hoặc với cả lira_cbt và eur_hedge (làm y). Điều này có thể đạt được với sys.argv?Sys.argv có thể xử lý các đối số tùy chọn không?

+1

Nếu CLI của bạn được mà phức tạp, có lẽ bạn nên bắt đầu sử dụng 'argparse' (hoặc' optparse' nếu bạn đang mắc kẹt với một số phiên bản cũ). – delnan

Trả lời

15

Chỉ cần sử dụng chiều dài của sys.argv

if len(sys.argv) == 2: 
    # do X 
else: 
    # do Y 
2

Bạn chỉ cần kiểm tra độ dài sys.argv.

if len(sys.argv) < 2: 
    # Error, not enough arguments 

lira_cbt = sys.argv[1] 
if len(sys.argv) == 2: 
    # Do X 
else: 
    eur_hedge = sys.argv[2] 
    # Do Y 
+0

Nhưng không có cách nào để kéo cụ thể giá trị trong eur_hedge mà không cần phải ném thêm một biến/quá nhiều để giải nén đối số? – Felix

+2

Không, không có cách nào để làm điều đó, trừ khi bạn muốn chuyển đổi nó thành một cuộc gọi hàm và sử dụng một cái gì đó như 'def main (script, lira_cbt, eur_hedge = None)' và 'main (* sys.argv)', Tôi chắc chắn sẽ không làm. –

1

lựa chọn khác là để trích xuất các giá trị từ danh sách argv sử dụng try:

lira_cbt = sys.argv[1] 
try: 
    eur_hedge = sys.argv[2] 
except IndexError: 
    eur_hedge = None 

if eur_hedge == None: 
    # Do X 
else: 
    # Do Y 

Bạn cũng có thể có một cái nhìn tại getopt cho một trình phân tích cú pháp linh hoạt hơn của các đối số dòng lệnh.

+2

optparse hoặc argparse sẽ tốt hơn nhiều so với getopt! – carl

5

Nếu đây là trở thành một phần của hơn một kịch bản ném đi, xem xét sử dụng argparse http://docs.python.org/library/argparse.html

Tại thời điểm nó sẽ phức tạp hơn nhiều, nhưng nó sẽ giúp bạn tiếp tục ghi nhận các tùy chọn chương trình của bạn chấp nhận và cũng cung cấp các thông báo lỗi hữu ích không giống như "quá nhiều giá trị để giải nén" mà người dùng có thể không hiểu.

0

Nếu tôi có thể đề nghị một cách tiếp cận khác:

from sys import argv 
option_handle_list = ['--script', '--lira_cbt', '--eur_hedge'] 
options = {} 
for option_handle in option_handle_list: 
    options[option_handle[2:]] = argv[argv.index(option_handle) + 1] if option_handle in argv else None 
if options['eur_hedge'] == None: 
    #Do x 
else: 
    #Do y 
+0

Trong khi điều này có thể làm việc, bằng cách sử dụng một mô-đun như 'argparse' cho nhiệm vụ này sẽ dễ dàng hơn và nhiều hơn nữa pythonic. – YSelf

+0

@YSelf Tôi không tranh luận về giải pháp truyền thống dễ dàng hơn. Chỉ cần trả lời câu hỏi ban đầu. –

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