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

The*_*hun 6 python shell command-line command-line-arguments argparse

我正在尝试使我的python程序在命令行中交互,用户应该能够执行以下操作:

python myprogram.py --create
Run Code Online (Sandbox Code Playgroud)

然后

python myprogram.py --send
Run Code Online (Sandbox Code Playgroud)

这时的问题是程序每次都停止并重新启动,所以我丢失了我用第一个命令创建的变量和对象.

我这样使用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()
Run Code Online (Sandbox Code Playgroud)

我不想在命令之间停止程序,怎么做?

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

hpa*_*ulj 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
Run Code Online (Sandbox Code Playgroud)

这可以被分解为while循环,raw_input直线和您自己对astr变量的评估.

argparse这里使用的关键是:

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


Viz*_*rei 0

cmd和的区别在于argparseis cmda "line-oriented command interpreter"whileargparse是 a parser 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)
Run Code Online (Sandbox Code Playgroud)

除此之外,Python argparse 和控制/覆盖退出状态代码python argparse - 在不带参数的情况下向子解析器添加操作?可能有帮助。

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