我想通过argparse实现python3命令行,该命令行支持位置参数和标志选项。
例如:
usage: mycmd [-v] [-h] [-o] text
mycmd text print text
mycmd -h show help message and exit
mycmd -v show version info
mycmd -o text print text and dump text to file mycmd.txt
这是我的实现:
import argparse
class MyCmd:
def __init__(self):
self.parser = argparse.ArgumentParser()
self.parser.add_argument('text', help='print text') # mycmd text
self.parser.add_argument('-v', action='store_true', dest='version', help='show version info') # mycmd -v
self.parser.add_argument('-o', dest='output', help='print text and dump text to file mycmd.txt')
def parse(self):
return self.parser.parse_args()
def text(self, text):
print(text)
def version(self):
print('version info: mycmd-0.0.1')
def output(self, text):
print(text)
fp = open('mycmd.txt', 'w')
fp.write(text + '\n')
fp.close()
if __name__=='__main__':
mycmd = MyCmd()
(options, args) = mycmd.parse()
if options.text is not None:
mycmd.text(text)
elif options.version is not None:
mycmd.version()
elif options.output is not None:
mycmd.output(options.output)
当我用以下方法测试时:
$ ./mycmd -v
给我错误:
usage: mycmd [-h] [-o OUTPUT]
[-v]
text
mycmd: error: the following arguments are required: text
为什么mycmd无法使用mycmd -v
?
您最初的实现所缺少的是在text processing流中包括特定子项的步骤。
这里是一个更简化的版本(没有课程):
import argparse
def version():
return 'v0.0.1'
def print_and_save(text, file_path):
print(text)
if file_path:
with open(file_path, 'w') as fp:
fp.write(text + '\n')
fp.close()
if __name__=='__main__':
# Root (rt)
root_parser = argparse.ArgumentParser()
root_parser.add_argument('-v', '--version', action='store_true', help='show version info')
root_sbparsers = root_parser.add_subparsers(help='sub-command help')
# Adding sub-commands
text_parser = root_sbparsers.add_parser('process', help='print text')
text_parser.add_argument('text', type=str, help='text you want to work with')
text_parser.add_argument('-o', type=str, default=None, help='print text and dump text to file mycmd.txt')
args = root_parser.parse_args()
if args.version:
print(version())
elif args.text:
print_and_save(args.text, args.o)
我不确定为什么您必须将其嵌入整个类中,但这是它的版本:
import argparse
class MyCmd(object):
def __init__(self):
# Root (rt)
self.parser = argparse.ArgumentParser()
self.parser.add_argument('-v', '--version', action='store_true', help='show version info')
root_sbparsers = self.parser.add_subparsers(help='sub-command help')
# Adding sub-commands
text_parser = root_sbparsers.add_parser('process', help='print text')
text_parser.add_argument('text', type=str, help='text you want to work with')
text_parser.add_argument('-o', type=str, default=None, help='print text and dump text to file mycmd.txt')
def parse(self):
return self.parser.parse_args()
def text(self, text):
print(text)
def version(self):
print('version info: mycmd-0.0.1')
def output(self, text, file_path):
with open(file_path, 'w') as fp:
fp.write(text + '\n')
fp.close()
if __name__=='__main__':
mycmd = MyCmd()
args = mycmd.parse()
if args.version:
mycmd.version()
elif args.text:
mycmd.text(args.text)
if args.o:
mycmd.output(args.text, args.o)