使用python控制“我的世界”服务器 [英] Controlling a minecraft server with python

查看:103
本文介绍了使用python控制“我的世界”服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经为此搜索了很多次,但还没有找到一个确定的解决方案。我找到的最接近的东西是:

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 "{}15"'.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 FilesJavajre1.8.0_111injava.exe" -Xms4G -Xmx4G -jar craftbukkit-1.10.2.jar nogui java')
            print("Server started.")
            on = "0"
    else:
        server_command(command)

当我启动此程序并键入‘start’时,CMD会立即闪现并关闭。取而代之的是,我希望CMD保持开放,而"我的世界"服务器从它运行。我不确定为什么会发生这种情况,也不知道问题是什么,如果有任何帮助,我们将不胜感激。

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

推荐答案

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

另一方面,使用subprocess.Popen可以在进程运行时访问它,包括写入它的.stdin,这就是将数据发送到服务器的方式:

def server_command(cmd):
    process.stdin.write(cmd+"
") #just write the command to the input stream
process = None
executable = '"C:Program FilesJavajre1.8.0_111injava.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以读取它的错误流(如果有)

此外,您还可以使用打印函数的file可选参数,而不是process.stdin.write(cmd+" "),因此:

print(cmd, file=process.stdin)

会将数据写入process.stdin,格式与打印通常相同,类似于以换行符结束,除非传递end=以覆盖它,依此类推。

这篇关于使用python控制“我的世界”服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆