python:argparse中的stdout PIPE不工作

0 投票
1 回答
623 浏览
提问于 2025-05-01 18:03

这是我同事写的一段代码,目的是在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 

撰写回答