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)
我不想在命令之间停止程序,怎么做?
这是一个简单的交互式脚本.我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是一个简单的命名空间对象.您可以将参数作为属性访问.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 - 在不带参数的情况下向子解析器添加操作?可能有帮助。
第一个部分展示了如何覆盖退出,第二个部分展示了如何添加子命令或退出操作。