我如何在仍在运行的标准输入中写入进程stdin并从其标准输出中读取?

问题描述 投票:1回答:1

编辑:我正在Windows上运行此服务器,因为服务器是在我的主要游戏装备上管理的]

我正在尝试创建一个Minecraft服务器控制器,以便可以简化管理服务器的过程。我已经能够使用子进程启动和停止服务器,而不会出现问题,但是当我尝试使其发出命令时,它将不会。除非我使用subprocess.communicate(),否则此解决方案的问题是它将导致脚本永远等待并最终崩溃,从而使服务器继续运行。这是我所拥有的代码。

import subprocess


class Server:
    def __init__(self, server_start_bat, dir):
        self.server_start_bat = server_start_bat
        self.dir = dir

    def start_server(self):
        self.server = subprocess.Popen(self.server_start_bat, cwd=self.dir, shell=True, stdin=subprocess.PIPE,
                                       universal_newlines=True, text=True)

    def stop_server(self):
        self.run_command('stop')
        self.server.communicate()

    def op_me(self):
        self.run_command(f'op Username')

    def clear_weather(self):
        self.run_command(f'weather clear 1000000')

    def mob_griefing_on(self):
        self.run_command(f'gamerule mobGriefing True')

    def mob_griefing_off(self):
        self.run_command(f'gamerule mobGriefing True')

    def set_time_day(self):
        self.run_command(f'time set day')

    def set_time_night(self):
        self.run_command(f'time set night')

    def run_command(self, command_text):
        self.server.stdin.write(f'{command_text}\n')

编辑:我正在Windows上运行此程序,因为服务器是在我的主要游戏装备上进行管理的,所以我试图创建一个Minecraft服务器控制器,以便可以简化管理过程...

python subprocess
1个回答
1
投票
我当时正在与一个非常相似的问题作斗争,我花了三天的时间才能将其全部运行。subprocess.communicate的问题在于您只能调用一次,而子进程终止后似乎只能给出输出(根据我的经验,很可能是错误的)。
© www.soinside.com 2019 - 2024. All rights reserved.