作者:琳琳小朋友m | 来源:互联网 | 2024-10-20 12:17
我花了几个小时阅读关于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()