2016-03-30 11 views
0

Ich benutze Windows und suche nach einem Handler oder Wrapper mit Python für einen Minecraft-Server, so dass ich Befehle ohne Benutzereingaben automatisch eingeben kann. Ich habe viele Fragen auf der Website durchsucht und fand nur halbe Antworten (zumindest in meinem Fall). Ich glaube, dass ich das Unterprozessmodul benutzen muss, aber ich kann nicht entscheiden, welches ich im Moment verwende, um mit den Popen-Funktionen zu experimentieren.Ein Python-Wrapper oder Handler für einen Minecraft-Server

server = Popen("java -jar minecraft_server.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() 

Dies funktioniert in gewisser Weise aber nur druckt eine Zeile für jedes Mal, wenn Sie einen Befehl eingeben, die nicht arbeiten kann, und all meine Bemühungen um dieses Ziel zu ändern up: Ich habe eine Antwort, die ich für meinen Fall modifizierte gefunden mit dem Programm nichts anderes ausführen und stattdessen nur lesen. Dies ist keine doppelte Frage, weil keine der Antworten in ähnlichen Fragen mir genug helfen könnte.

Antwort

0

Wie Sie bereits wissen, blockieren Ihre server.stdout.readline() und input("> ") Ihre Codeausführung.
Sie müssen Ihren Code nicht blockierend machen, indem Sie nicht warten, um tatsächlich zurückzugeben, was Sie wollen, sondern indem Sie prüfen, ob es etwas zu lesen und zu ignorieren gibt, wenn nicht und weiterhin andere Dinge tun.

Auf Linux-Systemen können Sie möglicherweise select module verwenden, aber unter Windows funktioniert es nur auf Sockets.

Ich konnte es mithilfe von Threads und Warteschlangen unter Windows arbeiten lassen. (Anmerkung: es ist Python 2 Code)

+0

Vielen Dank dafür, wie ich die Hoffnung verlor, etwas Ähnliches zu finden, das tatsächlich arbeitete. Es tut mir wirklich leid, dass ich das zu spät bemerkt habe, weil ich sehen konnte, dass es keine sofortige Antwort geben würde. Danke :) –