我正在尝试通过子流程模块控制子流程。
我正尝试使用其标准输出从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无法读取。它只是被阻止!
readline是一个阻止呼叫。读取直到换行符或EOF。
我不确定,但是问题是由于子进程在您发送命令后未向Stdout写入任何内容。因此,父进程正在等待readline函数。