如何通过管道将一个 python 脚本的输出作为另一个 python 脚本的输入?

2023-12-06

例如:

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(使用前将#替换为@)

如何通过管道将一个 python 脚本的输出作为另一个 python 脚本的输入? 的相关文章

  • 哈希 freezeset 与排序元组

    在 Python 中 给定一组可比较的 可散列的元素s 散列是否更好frozenset s or tuple sorted s 这取决于你在做什么 创建一个更快frozenset 比排序tuple but frozenset占用的内存比tu
  • 在 shell/shell 脚本中设置 MongoDB 写关注

    我正在尝试填充一个集合MongoDB的壳 据我了解 使用轻松的Write Concern可以大大加快这个过程 我说的是文档 http docs mongodb org manual core write concern write oper
  • 将文件拆分为块

    我正在尝试分割格式为以下的文件 some garbage lines target G0 S0 type xy 0 108847E 02 0 489034E 04 0 108711E 02 0 491023E 04 0 108574E 02
  • 是否可以从应用程序执行 ADB shell 命令?

    我有一个安卓电脑 http www timingpower com rk3288 with root 开箱即用 连接到始终以横向显示的外部显示器 HDMI 和 USB 即使我的应用程序在清单中的活动声明中指定纵向 android scree
  • 适用于 Python 3.x 的 Hive 客户端

    是否可以使用 Python 3 x 连接到 hadoop 并运行 hive 查询 我正在使用Python 3 4 1 我发现可以按照这里写的方式完成 https cwiki apache org confluence display Hiv
  • 如何将 UPX 与 pyinstaller 一起使用?

    如何将 UPX 与 pyinstaller 一起使用 我正在关注文档 我已经下载了UPX 我的文件如下所示 import csv import selenium import pandas print Hello 然后我运行 pyinsta
  • 运行时错误:大小不匹配,m1:[4 x 3136],m2:[64 x 5]位于c:\ a \ w \ 1 \ s \ tmp_conda_3.7_1

    我使用 python 3 当我插入变换随机裁剪大小 224 时 它会给出未匹配错误 这是我的代码 https github com kajasumanie medical plant classification blob master i
  • 如果文件修改日期早于 N 天

    此问题涉及在文件的修改日期早于这么多天时采取行动 我确信创建日期或访问日期会类似 但对于修改日期 如果我有 file path name to some file N 100 for example N is number of days
  • 如何使用 bash 脚本通过 tar 备份文件系统?

    我想备份我的 ubuntu 文件系统 我写了这个小脚本 这是非常基本的 但这是我第一次尝试 我害怕犯错误 由于需要几个小时才能完成才能看到结果 因此我认为最好向经验丰富的程序员询问我是否做错了什么 我特别感兴趣 gt 会记录输出mv或者它也
  • 在Python 3中将二进制字符串转换为字节数组

    尽管有很多相关的问题 但我找不到任何符合我的问题的问题 我想更改二进制字符串 例如 0110100001101001 转换成字节数组 同一个例子 b hi 我试过这个 bytes int i for i in 011010000110100
  • AIOHTTP - Application.make_handler(...) 已弃用 - 添加多重处理

    我经历了 我可以从 Python Web 服务器中获得多少性能 的旅程 这让我想到了 AIOHTTP 和 uvloop 尽管如此 我仍然可以看到 AIOHTTP 并未充分利用我的 CPU 潜力 我开始将多处理与 AIOHTTP 结合使用 我
  • 使用转义序列渲染文本(如终端)

    你好 我正在寻找一些库或工具来在文本文件中呈现带有转义序列字符的文本 我不知道如何称呼它 但这是一个例子 echo e abc vdef abc def echo e abc vdef gt tmp xxxxx vi tmp xxxxx 我
  • Angular 2 - 在(点击)事件中使用管道

    我的问题可能很简单 但只是找不到在事件 例如 单击 中使用管道的方法 像这样的事情
  • Python 3 __getattribute__ 与点访问行为

    我读了一些关于 python 的对象属性查找的内容 这里 https blog ionelmc ro 2015 02 09 understanding python metaclasses object attribute lookup h
  • shell脚本中是否有互斥/信号量机制?

    我正在 shell 脚本中寻找互斥 信号量 并发机制 考虑以下情况 除非 a 用户不关闭共享文件 否则 b 用户应该无法打开 更新它 我只是想知道如何在 shell 脚本中实现互斥量 信号量 临界区等 在 shell 脚本中实现锁定机制 文
  • 如何隐藏显示终端命令输出

    当我运行这个命令时 sudo htpasswd b home reynolds htpasswd admin admin 我正在得到输出Updating password for user admin在终端中 但我不想显示该输出 所以我在谷
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • LaunchAgent 不运行 shell 脚本

    在 Catalina 之前的 macOS 下 我有一个每天运行 shell 脚本的 LaunchAgent 升级并切换到 zsh 后 它不起作用 我检查过的事情 shebang 切换到 zsh shell脚本可以从命令行手动执行 sh 在系
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute
  • TypeError:无法使用抽象方法实例化抽象类 <...>

    这是我的代码 from abc import ABC from abc import abstractmethod class Mamifiero ABC docstring for Mamifiero def init self self

随机推荐