You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:36:02