热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python–像典型的过滤程序一样解析cmdargs

我花了几个小时阅读关于argparse的教程并设法学习使用普通参数.officialdocumentation对我来说不太可读.我是Python的新手.我正在尝试编写一个可以通过以

我花了几个小时阅读关于argparse的教程并设法学习使用普通参数. official documentation对我来说不太可读.我是Python的新手.我正在尝试编写一个可以通过以下方式调用的程序:

cat inFile |程序[选项]> outFile – 如果未指定inFile或outfile,则从stdin读取并输出到stdout.

程序[options] inFile outFile

program [options] inFile> outFile – 如果只指定了一个文件,则输入和输出应该转到stdout.

cat inFile | program [options] – outFile – 如果’ – ‘代替inFlie从stdin读取.

program [options] / path / to / folder outFile – 处理/ path / to / folder及其子目录中的所有文件.

我希望它在GNU / Linux下表现得像普通的cli程序.

如果程序能够被调用也会很好:

program [options] inFile0 inFile1 … inFileN outFile – 第一个路径/文件始终被解释为输入,最后一个总是被解释为输出.任何其他的解释为输入.

我可能会编写可以实现此目的的脏代码,但这将被使用,所以有人最终会维护它(他会知道我住的地方……).

任何帮助/建议都非常感谢.

结合答案和来自互联网的更多知识我已经设法写了这个(它不接受多个输入,但这已经足够了):

import sys, argparse, os.path, glob
def inputFile(path):
if path == "-":
return [sys.stdin]
elif os.path.exists(path):
if os.path.isfile(path):
return [path]
else:
return [y for x in os.walk(path) for y in glob.glob(os.path.join(x[0], '*.dat'))]
else:
exit(2)
def main(argv):
cmdArgsParser = argparse.ArgumentParser()
cmdArgsParser.add_argument('inFile', nargs='?', default='-', type=inputFile)
cmdArgsParser.add_argument('outFile', nargs='?', default='-', type=argparse.FileType('w'))
cmdArgs = cmdArgsParser.parse_args()
print cmdArgs.inFile
print cmdArgs.outFile
if __name__ == "__main__":
main(sys.argv[1:])

谢谢!

解决方法:

您需要一个位置参数(名称不以短划线开头),可选参数(nargs =’?’),默认参数(默认=’ – ‘).此外,argparse.FileType是一个便利工厂,如果 – 传递,则返回sys.stdin或sys.stdout(取决于模式).

全部一起:

#!/usr/bin/env python
import argparse
# default argument is sys.argv[0]
parser = argparse.ArgumentParser('foo')
parser.add_argument('in_file', nargs='?', default='-', type=argparse.FileType('r'))
parser.add_argument('out_file', nargs='?', default='-', type=argparse.FileType('w'))
def main():
# default argument is is sys.argv[1:]
args = parser.parse_args(['bar', 'baz'])
print(args)
args = parser.parse_args(['bar', '-'])
print(args)
args = parser.parse_args(['bar'])
print(args)
args = parser.parse_args(['-', 'baz'])
print(args)
args = parser.parse_args(['-', '-'])
print(args)
args = parser.parse_args(['-'])
print(args)
args = parser.parse_args([])
print(args)
if __name__ == '__main__':
main()


推荐阅读
author-avatar
琳琳小朋友m
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有