2016-03-30 17 views
0

Windows kullanıyorum ve bir Minecraft sunucusu için Python kullanarak bir kullanıcı veya sarıcı arıyorum, böylece kullanıcı girişi olmadan komutları otomatik olarak girebiliyorum. Web sitesinde birçok soruyu araştırdım ve sadece yarı cevapları buldum (en azından benim durumumda). Alt-işlem modülünü kullanmam gerekeceğine inanıyorum ama şu anda Popen fonksiyonlarını denediğimde hangisinin kullanılacağına karar veremiyorum. Benim durum için modifiye bir cevap bulduk:A Minecraft Sunucusu için Python Wrapper veya İşleyici

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() 

Bu bir şekilde çalışır ancak bu sonuna kadar değiştirmek için bütün çabaları çalışmak ve olamaz, hangi bir komutu girin her zaman için bir çizgi yazdırır Program ile başka bir şey yürütemedi ve bunun yerine sadece okudu. Bu yinelenen bir soru değildir, çünkü benzer sorulardaki cevapların hiçbiri bana yeterince yardımcı olamaz.

cevap

0

Bildiğiniz gibi server.stdout.readline() ve input("> ") kod yürütmenizi engelliyor.
Kodunuzu engellemeyi, aslında ne istediğinizi döndürmeyi beklemeden beklemeniz gerekir; ancak, başka şeyler yapmadığınız ve devam edip etmediği, okumak ve göz ardı edecek bir şey olup olmadığını kontrol ederek.

Linux sistemlerinde select module'u kullanabilirsiniz, ancak Windows'da yalnızca yuvalarda çalışır.

Windows üzerinde iş parçacığı ve kuyrukları kullanarak çalışmayı başardım. (not: Python 2 kodu)

import subprocess, sys 
from Queue import Queue, Empty 
from threading import Thread 

def process_line(line): 

    if line == "stop\n": # lines have trailing new line characters 
     print "SERVER SHUTDOWN PREVENTED" 
     return None 
    elif line == "quit\n": 
     return "stop\n" 
    elif line == "l\n": 
     return "list\n" 

    return line 

s = subprocess.Popen("java -jar minecraft_server.jar nogui", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

def read_lines(stream, queue): 
    while True: 
     queue.put(stream.readline()) 

# terminal reading thread 
q = Queue() 
t = Thread(target=read_lines, args=(sys.stdin, q)) 
t.daemon = True 
t.start() 

# server reading thread 
qs = Queue() 
ts = Thread(target=read_lines, args=(s.stdout, qs)) 
ts.daemon = True 
ts.start() 

while s.poll() == None: # loop while the server process is running 

    # get a user entered line and send it to the server 
    try: 
     line = q.get_nowait() 
    except Empty: 
     pass 
    else: 
     line = process_line(line) # do something with the user entered line 
     if line != None: 
      s.stdin.write(line) 
      s.stdin.flush() 

    # just pass-through data from the server to the terminal output 
    try: 
     line = qs.get_nowait() 
    except Empty: 
     pass 
    else: 
     sys.stdout.write(line) 
     sys.stdout.flush() 
+0

Bunun için çok teşekkür ederim, gerçekten de işe yaramış benzer bir şey bulma umudum kaybettim. Bu gecikmeyi fark ettiğim için gerçekten üzgünüm çünkü anlık bir cevap gelmeyeceğini görebiliyordum. Teşekkürler :) –