python:argparse中的stdout PIPE不工作
这是我同事写的一段代码,目的是在Python中制作一个参数解析器。
if not sys.stdin.isatty():
# Running in pipe mode
pipe_mode = True
else:
opts.add_argument('address', nargs='+')
现在的问题是,当我们通过管道传入标准输入时,它没有读取到。这是我想要做的事情:
subprocess.Popen(["nomadly-geocode", "-o", "json", values[1]],
stdout=subprocess.PIPE)
因为我正在将标准输出通过管道传递,所以应该可以正常工作。但是我遇到了一个错误,它无法识别参数。(如果我们在命令行中运行这个函数,它是可以正常工作的)
错误信息:(假设values[1] = Sydney)
usage: nomadly-cli-geocode [-h] [-o {parse,json,human}] [-u]
nomadly-cli-geocode: error: unrecognized arguments: Sydney
1 个回答
1
因为你没有设置标准输入(stdin),所以子进程会从它的父进程那里继承标准输入。如果父进程的标准输入连接到了一个终端,那么子进程的标准输入也是如此。你可以通过将子进程的标准输入设置为 subprocess.NONE
来禁用它。
更好的方法是把地址作为一个可选参数。然后检查这个地址参数的值,而不是检查标准输入是什么。
例如:
opt.add_argument("--address", "-a", nargs="*")
...
if not args.address:
# try to get address from stdin