2014-10-12 12 views
5

tôi đang cố gắng để làm cho chương trình python của tôi tương tác trong dòng lệnh, người dùng sẽ có thể làm công cụ như:Hãy chương trình dòng lệnh python của tôi tương tác với argparse

python myprogram.py --create 

sau đó

python myprogram.py --send 

Vấn đề ở đây là khi chương trình dừng và khởi động lại mỗi lần vì vậy tôi mất biến và đối tượng mà tôi đã tạo bằng lệnh đầu tiên.

Tôi đang sử dụng argparse trên đường này:

parser = argparse.ArgumentParser() 
parser.add_argument('-c','--create' ,help='',action='store_true') 
parser.add_argument('-s','--send',help='',action='store_true') 
args = parser.parse_args() 

if args.create: 
    create() 
elif args.send : 
    send() 

Tôi không muốn dừng chương trình giữa các lệnh, làm thế nào để làm điều này?

dụ: https://coderwall.com/p/w78iva

+2

Tôi nghĩ rằng những gì bạn muốn là một vòng lặp in một trình đơn các hành động có thể, một trong số đó là "thoát". –

+0

Argparse có chức năng để thực hiện việc này. Những gì tôi cần là tương tác với chương trình của tôi mà không cần rời khỏi – TheShun

Trả lời

0

Các diffrence trong cmdargparsecmd là một "line-oriented command interpreter" khi argparse là một parser for sys.argv.

Ví dụ của bạn phân tích cú pháp sys.argv mà bạn truyền trong khi chạy chương trình của bạn và sau đó nếu nó nhận được giá trị bạn bắt đầu một hàm và sau đó thoát.

argparse sẽ chỉ phân tích cú pháp sys.argv trong khi chạy chương trình.

Bạn có thể thêm một số mã để có thể làm việc với args bạn chuyển như một hàm hoặc lớp hoặc thực hiện trong menu chương trình mà bạn có thể hoạt động với raw_input. Ví dụ:

class Main(): 
    def __init__(self, create=None, send=None): 
    if create: 
    self.create(create) 
    elif send: 
    self.send(send) 

    option = raw_input('What do you want to do now?') 
    print option 

    def create(self, val): 
    print val 

    def send(self, val): 
    print val 


if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-c','--create' ,help='',action='store_true') 
    parser.add_argument('-s','--send',help='',action='store_true') 
    args = parser.parse_args() 

    Main(args.create, args.send) 

khác thì đó Python argparse and controlling/overriding the exit status code hoặc python argparse - add action to subparser with no arguments? có thể giúp đỡ.

Lần đầu tiên nó cho thấy cách bạn có thể ghi đè thoát và trong lần thứ hai, bạn có thể thêm các lệnh con hoặc các phép hủy.

+0

Tes Những gì tôi cần là để có thể đưa ra lệnh mà không cần thoát khỏi chương trình. Giống như khi bạn nhấp vào nút để thực hiện hành động, hãy nhấp vào nút khác để thực hiện hành động khác nhưng không đóng chương trình – TheShun

5

Đây là một tập lệnh tương tác đơn giản. Tôi sử dụng argparse để phân tích cú pháp các dòng đầu vào, nhưng nếu không thì không cần thiết cho hành động. Tuy nhiên nó có thể là một cách tiện dụng để thêm các tùy chọn cho lệnh 'create' của bạn. Ví dụ, sử dụng ipythonargparse để xử lý %magic lệnh của nó:

import argparse 
parser = argparse.ArgumentParser(prog='PROG', description='description') 
parser.add_argument('cmd', choices=['create','delete','help','quit']) 

while True: 
    astr = raw_input('$: ') 
    # print astr 
    try: 
     args = parser.parse_args(astr.split()) 
    except SystemExit: 
     # trap argparse error message 
     print 'error' 
     continue 
    if args.cmd in ['create', 'delete']: 
     print 'doing', args.cmd 
    elif args.cmd == 'help': 
     parser.print_help() 
    else: 
     print 'done' 
     break 

Điều này có thể bị tước xuống while vòng lặp, các raw_input dòng, và đánh giá của riêng bạn của biến astr.

Chìa khóa để sử dụng argparse đây là:

  • parse_args có thể mất một danh sách các chuỗi (kết quả của split()) thay vì sử dụng mặc định sys.argv[1:].
  • nếu parse_args thấy sự cố (hoặc '-h'), nó in một thông báo và cố gắng 'thoát'. Nếu bạn muốn tiếp tục, bạn cần phải bẫy lỗi đó, do đó khối try.
  • đầu ra của parse_args là một đối tượng không gian tên đơn giản. Bạn truy cập các đối số dưới dạng thuộc tính.
  • bạn có thể dễ dàng thay thế trình phân tích cú pháp của riêng mình.
Các vấn đề liên quan