Использование подпроцесса для управления серверами Minecraft - PullRequest
1 голос
/ 26 марта 2020

Я использую несколько модифицированных серверов Minecraft для друзей на своем P C, я пытаюсь создать программу, которая делает их запуск и отправку команд им намного проще.

Я запускаю серверы, используя файл bat и смог заставить subprocess сделать это без проблем, но я не уверен, как go добавить функциональность выдачи команд на сервер через консоль.

У меня есть подумал об использовании 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()

1 Ответ

1 голос
/ 26 марта 2020

Есть две проблемы, я думаю:

  1. stop_server и command каждый запускает новый подпроцесс, который должен быть выполнен только в start_server.

  2. start_server использует server.communicate(), который блокирует выполнение подпроцесса, не позволяя программе отправлять любые другие команды на сервер во время работы.

Вместо этого

  • start_server должен создать подпроцесс, а затем сохранить его в переменной, к которой могут обращаться stop_server и command,
  • 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...