如何用Python无需实际键入即可向Minecraft服务器控制台发送命令
方案1:通过Python直接托管Minecraft服务进程(最优解,可重启服务时用)
这个方案不需要操作现有窗口,直接用Python的subprocess模块拉起MC服务端进程,直接持有进程的标准输入输出管道,发命令完全后台执行,无窗口操作,稳定可靠。
import subprocess import threading # 替换为你自己的MC服务端启动命令,比如带java参数的那行 START_CMD = "java -Xmx4G -Xms2G -jar server.jar nogui" # Windows下控制台默认编码一般是gbk,部分服务端可能是utf-8,不生效可以换着试 ENCODING = "gbk" # 启动服务端进程,捕获标准输入、输出、错误流 mc_process = subprocess.Popen( START_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, encoding=ENCODING, cwd="你的MC服务端所在文件夹路径" ) # 可选:单独开线程监听服务端输出,方便你推送到Discord或者存日志 def listen_output(): for line in iter(mc_process.stdout.readline, ""): if line: # 这里可以加把输出转发到Discord的逻辑,不用再截图了 print(f"[MC服务端] {line.strip()}") threading.Thread(target=listen_output, daemon=True).start() # 下发命令的函数,直接调用就行,比如发list看在线玩家 def send_command(cmd: str): mc_process.stdin.write(cmd + "\n") mc_process.stdin.flush() # 测试示例 send_command("list")
这个方案的优势:
- 完全不需要操作窗口,全程后台运行
- 可以直接获取服务端输出,不用再截图给用户,体验更好
- 稳定性远高于窗口操作,不会因为窗口最小化、被遮挡失效
方案2:给已经在运行的控制台窗口下发命令(不想重启服务时用)
如果你的服务已经开了很久不想关,可以用pywin32调用Windows控制台API直接往输入缓冲区写命令,不需要激活窗口、不需要模拟按键。
import win32console import win32gui import win32process import ctypes # 先通过窗口标题找到控制台窗口句柄,替换成你自己的MC控制台窗口标题 WINDOW_TITLE = "Minecraft 服务器" hwnd = win32gui.FindWindow(None, WINDOW_TITLE) # 获取窗口对应的进程ID _, pid = win32process.GetWindowThreadProcessId(hwnd) # 附加到目标进程的控制台 kernel32 = ctypes.WinDLL("kernel32", use_last_error=True) if not kernel32.AttachConsole(pid): raise Exception(f"附加控制台失败,错误码:{kernel32.GetLastError()}") # 获取标准输入句柄 stdin_handle = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE) # 构造输入记录,这里输入命令+回车 def send_command(cmd: str): # 把命令转成输入事件 input_records = [] for c in cmd + "\r": ir = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) ir.KeyDown = True ir.Char = c ir.RepeatCount = 1 input_records.append(ir) # 写入控制台输入缓冲区 stdin_handle.WriteConsoleInput(input_records) # 测试示例 send_command("list") # 用完记得释放控制台 kernel32.FreeConsole()
注意事项:
- 窗口标题要写对,如果找不到可以用
win32gui.EnumWindows遍历所有窗口找标题带MC相关关键词的 - 运行这段代码的Python进程需要和目标MC控制台进程同权限,比如都是管理员或者都不是
控制台界面参考

内容的提问来源于stack exchange,提问作者JustOscarJ
相关产品推荐
相关产品推荐

