sub script stdin prompt text display after user input content when using subprocess popen

Viewed 15

I am trying to write one script to read the output of another py file. and because the calling py file may have some input. So in main python file, I would handle the stdin.

I got one strange phenomenon, the calling script's prompt ('please input something') is displayed after user input content. Any ideas?

see the picture

eating.py (main py)

# coding: utf-8
import subprocess
from queue import Queue
from threading import Thread


class TextStreaming(Thread):
    def __init__(self, stream, queue):
        super().__init__()
        self._streaming = stream
        self.queue = queue

    def run(self) -> None:
        for line in iter(self._streaming.readline, ''):
            self.queue.put(line)

cmd = 'python working.py'
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
queue = Queue()

mytest = TextStreaming(p.stdout, queue)
mytest.setDaemon(True)
mytest.start()

is_reading = True

while is_reading and mytest.is_alive():
    while is_reading and not queue.empty():
        line = queue.get()
        line = line.decode('utf-8')
        if line:
            print(line)
        if 'counting' in line:
            data = input()
            data = data.encode('utf-8')
            p.stdin.write(data)
            p.stdin.write(b'\n')
            p.stdin.flush()

working.py (calling script)

# coding: utf-8
import time

timeout = 30

deadtime = time.time() + timeout

count = 0

while time.time() < deadtime:
    count = count + 1
    print(f'{time.time()} I am working')
    time.sleep(1)
    if count == 5:
        print('counting came\n')
        data = input('please input something\n')
        print(f'{data} inputted')
0 Answers
Related