python - 在 Python(2.7 和 3.x)中读取其他脚本的管道输入,同时读取用户输入

标签 python python-3.x python-2.7 console

我有两个 Python 脚本,我想将第一个脚本的输出通过管道传输到第二个脚本中,同时还能够从第二个脚本中的控制台读取用户输入。

这是非常简化的示例代码,可以让您了解我想要做什么:

py_a.py

print(1+2)

py_b.py

import sys

invalue = sys.stdin.read()
print("value from py_a is " + invalue)

answer = input("Talk to me! ")
# do something with answer

在终端我希望做类似的事情 python py_a.py | python py_b.py

但是,当我尝试从控制台获取输入时,会发生以下情况:

Talk to me! Traceback (most recent call last):
  File "py_b.py", line 3, in <module>
    answer = input("Talk to me! ")
EOFError: EOF when reading a line

关于如何让它发挥作用有什么想法吗?

最佳答案

您已经使用 read() 方法耗尽了标准输入并到达了文件末尾,该方法读取整个文件流直到 EOF,因此当 input () 想要从同一个文件流中读取更多内容,但它不能,因为文件流已经达到 EOF。

您应该删除行 line = sys.stdin.read() 因为您实际上只需要用户输入一行输入,这是 input() 函数就可以了。

编辑:如果您希望py_b.py能够在读取从py_a.py传输的标准输入后从控制台读取数据,您可以安装keyboard模块直接从用户键盘读取:

import keyboard
import time

class InputHandler:
    def __init__(self):
        self.buffer = ''

    def on_press(self, event):
        if event.name == 'enter':
            self.do_something()
            self.buffer = ''
        elif event.name == 'backspace':
            self.buffer = self.buffer[:-1]
        else:
            self.buffer += event.name

    def do_something(self):
        global running
        if self.buffer == 'exit':
            running = False
        print('You entered: ' + self.buffer)

invalue = sys.stdin.read()
print("value from py_a is " + invalue)

keyboard.on_press(InputHandler().on_press)
running = True
while running:
    time.sleep(1)

关于python - 在 Python(2.7 和 3.x)中读取其他脚本的管道输入,同时读取用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53012272/

相关文章:

Python新手类设计题

python - 包括 numpy random.uniform 的上限

python - 递归选择排序以返回python中的降序列表

python - 将今天的日期与sqlite数据库表中的日期字段进行比较

python-2.7 - python tkinter 中 config() 的实用程序

python - Centos 6 中使用 SCL Python 2.7 的 Ansible 加密警告

python - 用于 HTTP 服务器之外的 Python3 的 Websocket 服务器

Python如何获取注册表中的文件夹名称

python - Cartopy 正交投影中的 0 - 360 经度标签

python - 在 Ubuntu 上安装 tweepy