为了账号安全,请及时绑定邮箱和手机立即绑定

使用子进程来控制我的世界服务器

使用子进程来控制我的世界服务器

红颜莎娜 2022-09-13 17:38:35
我在我的PC上为朋友运行了许多经过修改的Minecraft服务器,我正在尝试构建一个程序,使启动它们并向它们发送命令变得更加容易。我使用bat文件启动服务器,并且能够毫无问题地做到这一点,但我不确定如何通过控制台向服务器添加命令的功能。subprocess我想过使用,在交互式控制台中,它工作得很好。问题是,当我将其添加到代码中时,它会在服务器启动之前执行stop命令,因此服务器永远不会停止。我尝试过在单独的函数中执行此操作,但这也不起作用。stdin.write()这是我到目前为止的代码:类文件:import subprocessclass Server:    def __init__(self, server_start_bat, dir):        self.server_start_bat = server_start_bat        self.dir =dir    def start_server(self):        server = subprocess.Popen(self.server_start_bat, cwd=self.dir, shell=True, stdin=subprocess.PIPE, text=True)        server.communicate()    def stop_server(self):        server = subprocess.Popen(self.server_start_bat, cwd=self.dir, shell=True, stdin=subprocess.PIPE, text=True)        server.stdin.write('stop\n')    def command(self, command):        server = subprocess.Popen(self.server_start_bat, cwd=self.dir, shell=True, stdin=subprocess.PIPE, text=True)        self.command = command        server.stdin.write(f'{self.command}\n')简单的GUI我运行了它:from tkinter import *import Serversserver = Servers.Server('path\\to\\bat\\file\\batfile.bat', 'dir\\to\\run\\command\\in')main = Tk()main.title('Server Commander')server_title = Label(main, text="server, hosted on port ")server_title.pack()server_start = Button(main, text='Start', command=server.start_server)server_start.pack()server_stop = Button(main, text='Stop', command=server.stop_server)server_stop.pack()main.mainloop()
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

我认为有两个问题:

  1. stop_server并且每个子进程都启动一个新的子进程,这只能在 中完成。commandstart_server

  2. start_server在子进程完成之前使用哪些块,从而防止程序在运行时向服务器发送任何其他命令。server.communicate()

相反

  • start_server应创建子进程,然后将其存储在可由 和 访问的变量中,stop_servercommand

  • server.communicate应在 中完成。stop_server

stop_server也只是 的一个特例。command

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, text=True)


    def stop_server(self):

        self.command('stop')

        self.server.communicate()


    def command(self, command):

        self.server.stdin.write(f'{command}\n')


查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信