猿问

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

我在我的PC上为朋友运行了许多经过修改的Minecraft服务器,我正在尝试构建一个程序,使启动它们并向它们发送命令变得更加容易。


我使用bat文件启动服务器,并且能够毫无问题地做到这一点,但我不确定如何通过控制台向服务器添加命令的功能。subprocess


我想过使用,在交互式控制台中,它工作得很好。问题是,当我将其添加到代码中时,它会在服务器启动之前执行stop命令,因此服务器永远不会停止。我尝试过在单独的函数中执行此操作,但这也不起作用。stdin.write()


这是我到目前为止的代码:


类文件:


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):

        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 Servers


server = 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()


红颜莎娜
浏览 78回答 1
1回答

哔哔one

我认为有两个问题:stop_server并且每个子进程都启动一个新的子进程,这只能在 中完成。commandstart_serverstart_server在子进程完成之前使用哪些块,从而防止程序在运行时向服务器发送任何其他命令。server.communicate()相反start_server应创建子进程,然后将其存储在可由 和 访问的变量中,stop_servercommandserver.communicate应在 中完成。stop_serverstop_server也只是 的一个特例。commandimport subprocessclass 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')
随时随地看视频慕课网APP

相关分类

Python
我要回答