2014-10-12 52 views
5

我試圖讓我的Python程序的命令行交互,用戶應該能夠做的東西一樣:讓我的Python命令行程序互動與argparse

python myprogram.py --create 

然後

python myprogram.py --send 

此時的問題是程序每次停止並重新啓動,因此我失去了使用第一個命令創建的變量和對象。

我使用argparse在這條路上:

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() 

我不想停止命令的程序,如何做到這一點?

例如:https://coderwall.com/p/w78iva

+2

我想你想要的是打印一個可能的動作菜單,其中之一是「退出」的循環。 – 2014-10-12 06:44:02

+0

Argparse有一個功能來做到這一點。我需要的是在不退出的情況下與我的程序進行交互 – TheShun 2014-10-12 09:06:22

回答

0

之探源在cmd和​​是cmd"line-oriented command interpreter"而​​是parser for sys.argv

您的示例分析了您在運行程序時通過的sys.argv,然後如果它獲得值,則啓動一個函數並退出。

​​只會在運行程序時解析sys.argv

您可以添加一些代碼,以便能夠像args一樣通過函數或類,或者在程序菜單中進行操作,您可以使用raw_input進行操作。 例子:

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) 

其他然後,Python argparse and controlling/overriding the exit status codepython argparse - add action to subparser with no arguments?可能的幫助。

在第一個例子中,它顯示瞭如何重寫quit和第二個如何添加子命令或退出操作。

+0

Tes我需要的是能夠在不退出程序的情況下發出命令。就像當你點擊一個按鈕來做一個動作,然後點擊另一個來做另一個動作,但是沒有關閉程序 – TheShun 2014-10-12 09:05:12

5

這是一個簡單的交互式腳本。我使用​​解析輸入行,但否則它不是行動的基本要素。儘管如此,它仍然可以將選項添加到「創建」命令中。例如,ipython使用​​處理其%magic命令:

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 

這可以被剝離下來到while循環中,raw_input線,和你自己的astr變量的評價。

這裏使用​​的關鍵是:

  • parse_args可以採取的而不是使用默認sys.argv[1:]字符串列表(的split()的結果)。
  • 如果parse_args發現問題(或'-h'),它會打印一條消息並嘗試'退出'。如果你想繼續,你需要捕獲該錯誤,因此try塊。
  • parse_args的輸出是一個簡單的命名空間對象。您以參數的形式訪問參數。
  • 你可以輕鬆地替換你自己的解析器。
相關問題