You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python与Linux控制台版自定义Minecraft服务器交互?

如何用Python与自定义Minecraft服务器控制台应用交互?

嘿,这个需求刚好可以用Python的subprocess模块完美解决——我之前帮朋友处理过类似的自定义游戏服务器交互场景,下面给你一步步拆解实现方法,保证能搞定启动、日志捕获和命令交互这几个核心需求:

1. 基础框架:启动服务器进程并开启双向通信

首先我们要用subprocess.Popen来启动你的服务器程序,同时开启标准输入、输出的管道,这样才能实现和控制台的交互。这里要注意几个关键参数,确保能实时处理输出和输入:

import subprocess
import time
import threading

# 替换成你的服务器程序路径,比如"./custom-mc-server"
SERVER_PATH = "/path/to/your/custom-minecraft-server"

# 启动服务器进程
server_proc = subprocess.Popen(
    [SERVER_PATH],
    stdin=subprocess.PIPE,  # 允许向进程输入命令
    stdout=subprocess.PIPE,  # 捕获进程输出
    stderr=subprocess.STDOUT,  # 把错误输出合并到标准输出,统一处理
    text=True,  # 直接处理字符串而非字节流
    bufsize=1,  # 行缓冲模式,保证输出实时性
    universal_newlines=True
)

参数解释:

  • stderr=subprocess.STDOUT:避免分开处理正常日志和错误日志,统一捕获更方便
  • bufsize=1:让输出按行缓冲,不会出现日志堆积后一次性输出的情况
  • text=True:省去手动编码解码的麻烦,直接用字符串交互

2. 实时捕获并打印服务器日志

服务器会持续输出启动日志、玩家操作日志等,我们需要单独开一个线程来读取输出,不然主进程会被阻塞住没法发送命令:

def read_server_output(proc):
    """实时读取服务器输出并打印到控制台"""
    # 用iter循环读取每一行,直到进程结束返回空字符串
    for line in iter(proc.stdout.readline, ''):
        if line:
            # 可以根据需求修改日志格式,比如加上时间戳
            print(f"[SERVER LOG] {line.strip()}")
        # 检查进程是否已经终止,终止则退出循环
        if proc.poll() is not None:
            break

# 启动日志读取线程,设置为守护线程(主进程退出时自动终止)
output_thread = threading.Thread(target=read_server_output, args=(server_proc,))
output_thread.daemon = True
output_thread.start()

3. 向服务器发送命令

现在可以通过进程的stdin管道发送命令了,注意要加上换行符(模拟控制台回车),并且强制刷新缓冲区,确保命令立即被服务器接收:

def send_server_command(proc, command):
    """向服务器发送控制台命令"""
    # 先检查进程是否还在运行
    if proc.poll() is None:
        proc.stdin.write(f"{command}\n")
        proc.stdin.flush()  # 必须刷新,不然命令会留在缓冲区里
        print(f"[SEND COMMAND] {command}")
    else:
        print("⚠️ 服务器进程已终止,无法发送命令")

# 示例:等待服务器启动完成后发送命令(根据你的服务器启动时间调整sleep时长)
time.sleep(15)
send_server_command(server_proc, "say 👋 欢迎使用Python控制的Minecraft服务器!")
send_server_command(server_proc, "list")  # 查看在线玩家列表

4. 优雅终止进程与资源清理

最后要确保主程序退出时,服务器进程能被正常处理,避免残留僵尸进程:

try:
    # 让主进程保持运行,比如等待用户输入后退出
    input("\n按回车键停止服务器并退出程序...\n")
finally:
    # 关闭输入管道,让服务器收到EOF信号(如果服务器支持优雅退出的话)
    server_proc.stdin.close()
    # 等待服务器进程完全终止
    server_proc.wait()
    print("✅ 服务器进程已正常终止")

额外注意事项

  • 编码问题:如果你的服务器输出不是UTF-8编码,可以在Popen里指定encoding参数,比如encoding='latin-1'
  • 权限问题:确保你的Python脚本有执行服务器程序的权限,可通过chmod +x /path/to/server赋予执行权限
  • 异常处理:可以给send_server_command加上try-except块,处理进程终止后写入stdin的IO异常
  • 启动延迟:不同服务器启动时间不同,要根据实际情况调整time.sleep的时长,或者可以通过监听日志中的特定关键词(比如"Server started")来判断服务器是否就绪,这样比固定sleep更可靠

内容的提问来源于stack exchange,提问作者Bluebot

火山引擎 最新活动