我试图让我的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()
我不想在命令之间停止程序,怎么做?
答案 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)
cmd
和argparse
中的差异是cmd
是"line-oriented command interpreter"
而argparse
是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)
其他Python argparse and controlling/overriding the exit status code或python argparse - add action to subparser with no arguments?可能会有所帮助。
第一部分展示了如何覆盖退出,第二部分如何添加子命令或退出。