【问题标题】:How to manage stdin and out of a process during runtime?如何在运行时管理标准输入和进程外?
【发布时间】:2019-10-17 15:48:39
【问题描述】:

我正在尝试通过子进程模块控制子进程。

我正在尝试使用其标准输出从 Minecraft 基岩服务器软件中读取数据。但是,当我写入标准输入时,它会通过,但是当我之后从标准输出读取时,它会被阻止。

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 不会读取。刚刚被屏蔽了!

【问题讨论】:

    标签: python python-3.x subprocess


    【解决方案1】:

    readline 是一个阻塞调用。它会一直读取到换行符或 EOF。

    我不确定,但问题是由于子进程在您发送命令后没有向标准输出写入任何内容。因此父进程正在等待 readline 函数。

    【讨论】:

      猜你喜欢
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 2014-06-03
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多