Чтение входных данных из другого скрипта, а также чтение пользовательского ввода в Python (2.7 и 3.x) - PullRequest
0 голосов
/ 26 октября 2018

У меня есть два сценария 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

И в терминале Iхотите сделать что-то вроде 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 голосов
/ 26 октября 2018

Вы уже исчерпали стандартный ввод и достигли его конца файла, используя метод 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...