Как управлять стандартным вводом и выходом из процесса во время выполнения? - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь управлять дочерним процессом через модуль подпроцесса.

Я пытаюсь читать с программного обеспечения сервера Minecraft, используя его стандартный вывод. Однако, когда я пишу в stdin, он проходит, но когда я читаю из stdout, впоследствии он блокируется.

import subprocess as sp
proc = sp.Popen([r"C:\Users\jbloo\Documents\VSCode\Python\bedrock-server-1.12.1.1\bedrock_server.exe"], 
stdout=sp.PIPE, stderr=sp.STDOUT, stdin=sp.PIPE,  universal_newlines=True)
with proc:
    while True:
        # print("Trying to communicate")
        output = proc.stdout.readline().strip()
        print(output)
        if "Server started." in output:
            break
    while True:
        command = input("Command: ", ) + "\n"
        # command  = bytes(command, "utf-8")
        proc.stdin.write(command)
        print("Wrote")
        print(proc.stdout.readline())

Я пробовал многие другие решения, но, похоже, не могу его получить.

это конец терминала.

[2019-10-17 01:22:04 INFO] IPv4 supported, port: 19132
[2019-10-17 01:22:04 INFO] IPv6 supported, port: 19133
[2019-10-17 01:22:05 INFO] IPv4 supported, port: 54072
[2019-10-17 01:22:05 INFO] IPv6 supported, port: 54073
[2019-10-17 01:22:05 INFO] Server started.
Command: sdf
Wrote

STDOUT не читается. Он просто заблокирован!

1 Ответ

0 голосов
/ 17 октября 2019

readline - это блокирующий вызов. он читает до новой строки или EOF.

Я не уверен, но проблема в том, что дочерний процесс ничего не записывает в стандартный вывод после того, как вы отправили команду. следовательно, родительский процесс ожидает функции readline.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...