用python控制一个minecraft服务器

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

我为此搜索了很多,还没有找到明确的解决方案。我发现最接近的是:

import shutil
from os.path import join
import os
import time
import sys

minecraft_dir = ('server diectory')
world_dir = ('server world driectory')

def server_command(cmd):
    os.system('screen -S  -X stuff "{}\015"'.format(cmd))

on = "1"

while True:
    command=input()
    command=command.lower()
    if on == "1":
        if command==("start"):
            os.chdir(minecraft_dir)
            os.system('"C:\Program Files\Java\jre1.8.0_111\bin\java.exe" -Xms4G -Xmx4G -jar craftbukkit-1.10.2.jar nogui java')
            print("Server started.")
            on = "0"
    else:
        server_command(command)

当我启动这个程序并输入'start'时,CMD会立即闪烁并关闭。相反,我希望CMD在从它运行的Minecraft服务器上保持打开状态。我不确定为什么会发生这种情况或问题是什么,任何帮助都将不胜感激。

附:我已经根据我的需要对其进行了编辑(例如删除了不必要的备份脚本),但之前它没有用。原始链接是:https://github.com/tschuy/minecraft-server-control

python-3.x server minecraft servermanager
2个回答
3
投票

os.system将只是运行命令然后返回到您的python脚本,无法进一步与它通信。

另一方面,使用subprocess.Popen可以让您在运行过程中访问该进程,包括写入.stdin,这是您向服务器发送数据的方式:

def server_command(cmd):
    process.stdin.write(cmd+"\n") #just write the command to the input stream
process = None
executable = '"C:\Program Files\Java\jre1.8.0_111\bin\java.exe" -Xms4G -Xmx4G -jar craftbukkit-1.10.2.jar nogui java'
while True:
    command=input()
    command=command.lower()
    if process is not None:
        if command==("start"):
            os.chdir(minecraft_dir)
            process = subprocess.Popen(executable, stdin=subprocess.PIPE)
            print("Server started.")
    else:
        server_command(command)

你也可以通过stdout=subprocess.PIPE所以你也可以读取它的输出和stderr=subprocess.PIPE从它的错误流中读取(如果有的话)

除了process.stdin.write(cmd+"\n"),您还可以使用print函数的file可选参数,因此:

print(cmd, file=process.stdin)

将数据写入process.stdin的格式与打印正常情况相同,例如以换行符结束,除非传递end=以覆盖它等。


0
投票

使用minecraft查询会更容易。编写一个脚本,询问您是否要启动服务器

os.system(
    'C:\Program Files\Java\jre1.8.0_111\bin\java.exe" -Xms4G -Xmx4G -jar craftbukkit-1.10.2.jar nogui java'
)

然后进行无限循环并等待输入(它将阻止关闭cmd)按Enter后将此命令发送到服务器并将执行。

© www.soinside.com 2019 - 2024. All rights reserved.