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

时间:2018-10-26 15:49:55

标签: 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

关于如何使它工作的任何想法?

1 个答案:

答案 0 :(得分:0)

您已经使用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)