使用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读取,将以前读取的对象与新读取的对象进行比较,然后打印差异。