使用Python与minecraft服务器通信

使用Python与minecraft服务器通信,python,subprocess,ipc,minecraft,Python,Subprocess,Ipc,Minecraft,这个问题在我准备用一些相关信息回答时被删除了。我认为,尽管它的措辞让人们不喜欢它,而且没有发布任何代码,但这是一个有用的问题。因此,我决定把它和我的部分答案一起贴在这里。我目前的代码有一个问题,如果有人知道一个解决方案,我会很高兴听到它。此外,如果有人知道更清洁的解决方案(例如使用Popen对象的communicate方法),那也很好 我记得问题的相关部分是: 如何使用Python与Minecraft服务器通信?我已经设置了一个用户界面,但我不确定如何连接到服务器并向其发送命令。这是我目前解决此

这个问题在我准备用一些相关信息回答时被删除了。我认为,尽管它的措辞让人们不喜欢它,而且没有发布任何代码,但这是一个有用的问题。因此,我决定把它和我的部分答案一起贴在这里。我目前的代码有一个问题,如果有人知道一个解决方案,我会很高兴听到它。此外,如果有人知道更清洁的解决方案(例如使用
Popen
对象的
communicate
方法),那也很好

我记得问题的相关部分是:


如何使用Python与Minecraft服务器通信?我已经设置了一个用户界面,但我不确定如何连接到服务器并向其发送命令。

这是我目前解决此问题的方法。它允许与服务器轻松通信,但在没有更多行可读时,会出现挂起对
readline
的调用的问题。如果有人知道如何解决这个问题,我将非常感谢他们告诉我

from subprocess import Popen, PIPE, STDOUT
server = Popen("java -jar minecraft_server.1.7.4.jar nogui", stdin=PIPE, stdout=PIPE, stderr=STDOUT)
while True:
    print(server.stdout.readline())
    server.stdout.flush()
    command = input("> ")
    if command:
        server.stdin.write(bytes(command + "\r\n", "ascii"))
        server.stdin.flush()

请注意,要使此代码按原样工作,脚本必须与服务器位于同一目录中。

以下是我正在使用的代码,我对rlms的代码进行了一点编辑,以解决读线问题:

import os, sys, time
import subprocess

server = subprocess.Popen('./start.sh',stdin=subprocess.PIPE,shell=True)
content = ''
previousContent = ''
while True:
#you can add a time.sleep() to reduce lag   
f = open('logs/latest.log')
    content = f.read()
    if previousContent in content:
        content.replace(previousContent,'')
        if content != '':
            print(content)

    command = input('')
    if command:
        server.stdin.write(bytes(command + '\r\n', 'ascii'))
        server.stdin.flush()
   previousContent = f.read()

您不需要使用线程或类似的东西来继续而不必等待readline吗?我没有这个问题的解决方案,但也许这值得一提。@TankorSmash我想你可能可以在linux上使用
select
,但我不确定在windows上是否可以,在windows上,文件类对象显然是不可靠的(尽管它可以与套接字配合使用)。线程也将是一种选择,但本能地认为,这将是一种过度杀伤力。如果有一个解决方案使用了
communicate
,那么可以使用
timeout
参数来解决问题。或者可能正在等待Python 3.4中的
asyncio
模块!我知道这很旧,但最好的解决方案是在更新时直接从latest.log读取,将以前读取的对象与新读取的对象进行比较,然后打印差异。