使我的python命令行程序与argparse交互

时间:2014-10-12 06:41:09

标签: python shell command-line command-line-arguments argparse

我试图让我的python程序在命令行中交互,用户应该可以做类似的事情:

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 个答案:

答案 0 :(得分:5)

这是一个简单的交互式脚本。我使用argparse来解析输入行,但除此之外它对于操作并不重要。它仍然可以成为向“创建”命令添加选项的便捷方式。例如,ipython使用argparse来处理其%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变量的评估。

此处使用argparse的关键是:

  • parse_args可以获取字符串列表(split()的结果),而不是使用默认的sys.argv[1:]
  • 如果parse_args发现问题(或“-h”),则会打印一条消息并尝试“退出”。如果要继续,则需要捕获该错误,因此try阻止。
  • parse_args的输出是一个简单的命名空间对象。您可以将参数作为属性进行访问。
  • 您可以轻松替换自己的解析器。

答案 1 :(得分:0)

cmdargparse中的差异是cmd"line-oriented command interpreter"argparseparser for sys.argv

您的示例解析了在运行程序时传递的sys.argv,然后如果它获得了值,则启动一个函数然后退出。

argparse只会在运行程序时解析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?可能会有所帮助。

第一部分展示了如何覆盖退出,第二部分如何添加子命令或退出。