Argparse 可选的 stdin 读取和/或 stdout 输出。

6
一个非Python程序将调用一个Python程序,并带有输入和输出参数。在非Python程序中,输入可以是文件引用或重定向到stdin的字符串。输出可以是文件或stdout。
argparse.FileType似乎已经准备好处理这个问题,因为它已经有了特殊的“-”来指导到stdin/stdout。实际上,使用“-”来指导到stdout是可以的,但我不知道stdin的实现/语法是什么。
非Python代码中的示例调用: python mycode.py - output.txt python mycode.py - -
在此之后,非Python代码会做什么?输出一个输入字符串吗? 而Python代码在此之后会做什么?
我将始终需要区分双方参数的去向(即输入和输出),因此在add_argument中使用default="-"或default=sys.stdin将无法正常工作,因为它们需要缺失的参数。
以下是我到目前为止所拥有的:
parser = argparse.ArgumentParser()

parser.add_argument('read_fref', type=argparse.FileType('r'))
parser.add_argument('write_fref', type=argparse.FileType('w'))
parser_ns = parser.parse_args()

with parser_ns.read_fref as f_r:
    read_f = json.load(f_r)    

output = {'k': 'v'}

with parser_ns.write_fref as f_w:
    json.dump(output, f_w)
1个回答

9
我有点难理解你的问题。我知道Python和argparse在做什么,但是我还不太明白你要做什么。
你的示例看起来在Linux shell中调用时应该可以正常运行。使用-参数时,它应该从键盘接受输入,并在屏幕上显示它。但这些参数最常用于shell重定向控制>,<,|(细节因shell而异,如shbash等)。
但是,如果您正在使用shell将 stdin stdout 重定向到/从文件,则可以将这些文件作为命令行参数。
如果您对必需/默认问题感到困扰,请考虑将这些参数标记为可选项(也称为 optionals ):
parser.add_argument('-r','--readfile', type=argparse.FileType('r'), default='-')
parser.add_argument('-w','--writefile', type=argparse.FileType('w'), default='-')

通过这个变化,这些调用变得相同了。

python mycode.py -r - <test.json
python mycode.py <test.json
python mycode.py -r test.json

所有输出都写入屏幕(标准输出),类似地,可以进行重定向。

要输入键入的内容:

python mycode.py
{...}
^D

1
如果argparse参数是可选的,即非必需的,则default起作用。 - hpaulj
你提供的代码和调用可以从stdin接收输入,但是如何将输出写入文件而不是stdout呢?另外,如何从文件中读取输入而不是从stdin中读取?我在Windows cmd中尝试了几种方法,但都无法正常工作。 - Eric S
1
我的示例展示了如何从 test.json 文件中获取输入。对你原来的代码进行变化,可以用于输出 python mycode.py -w output.txt。我不记得 Windows 的 cmd 是否像 bash 一样具有 <,> 重定向功能。 - hpaulj
好的,明白了。我已经尝试了所有需要的变化,包括读取标准输入和写入标准输出: - Eric S
2
好的,明白了。我尝试了所有需要的变化,包括读取标准输入并写入标准输出:test.py -r - -w - <in.txt,以及读取标准输入并写入文件:test.py -r - -w out.txt <in.txt。感谢您的时间! - Eric S
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接