例如:
script1.py 从用户处获取中缀表达式并将其转换为后缀表达式并将其返回或打印到 stdout
script2.py 从 stdin 获取后缀表达式并对其求值并输出值
我想做这样的事情:
python3 script1.py | python3 script2.py
但这不起作用,你能指出我如何做到这一点的正确方向吗?
EDIT -
以下是有关“不起作用”的更多详细信息。
当我执行时python3 script1.py | python3 script2.py终端要求我输入 script2.py 程序的输入,而它应该要求输入 script1.py 程序的输入并将其重定向为 script2.py 的输入。
因此,它要求我“输入后缀表达式:”,而它应该要求“输入中缀表达式:”并将其重定向到后缀脚本。
如果我正确理解你的问题,你的两个脚本都会写出一个输入提示。例如,它们可能都是这样的:
in_string = input("Enter something")
print(some_function(in_string))
Where some_function
是一个函数,根据输入字符串(每个脚本中可能不同)具有不同的输出。
问题是"Enter something"
当一个脚本的输出通过管道传输到另一个脚本时,提示无法正确显示给用户。这是因为提示符被写入标准输出,因此第一个脚本的提示符通过管道传输到第二个脚本,同时显示第二个脚本的提示符。这是一种误导,因为它是第一个(直接)接收用户输入的脚本。提示文本也可能会弄乱两个脚本之间传递的数据。
这个问题没有完美的解决方案。一种部分解决方案是将提示写入标准错误,而不是标准输出。这将使您看到两个提示(尽管您实际上只能响应其中之一)。我认为你不能直接这样做input
, but print
如果需要,可以写入其他文件流:print("prompt", file=sys.stderr)
另一种部分解决方案是检查您的输入和输出流是否存在,如果其中一个不是“tty”(终端),则跳过打印提示。在Python中,你可以这样做sys.stdin.isatty()
。许多命令行程序如果直接连接到用户而不是连接到管道或文件,则具有不同的“交互模式”。
如果通过管道传输输出是程序的主要功能,那么您可能永远不想使用提示!许多标准 Unix 命令行程序(例如cat
and grep
)根本没有任何交互行为。它们要求用户传递命令行参数或设置环境变量来控制它们的运行方式。即使它们无法访问标准输入和标准输出,这也可以让它们按预期工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)