我为此搜索了很多,还没有找到明确的解决方案。我发现最接近的是:
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
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=
以覆盖它等。
使用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后将此命令发送到服务器并将执行。