将我的Python命令行程序与argparse交互

2024-04-24 04:11:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使我的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


Tags: storepy命令程序sendaddtrueparser
2条回答

这是一个简单的互动脚本。我使用argparse来解析输入行,但在其他情况下,它对操作不是必需的。不过,它还是一种向“create”命令添加选项的简便方法。例如,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的输出是一个简单的命名空间对象。可以将参数作为属性访问。
  • 您可以很容易地替换自己的解析器。

cmdargparse中的区别是cmd"line-oriented command interpreter",而argparseparser for sys.argv

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

运行程序时,argparse只分析sys.argv

您可以添加一些代码,以便能够使用像函数、类或make-in-program菜单那样传递的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,第二个例子显示了如何添加子命令或quitactions。

相关问题 更多 >