2017-10-04 6 views
1

Ich habe ein Problem in Bezug auf Pythonw. Ich mache ein Programm, das im Hintergrund ausgeführt werden soll. Wenn es startet, soll es den Computernamen, den Benutzernamen und das Ergebnis einer Überprüfung senden, um zu sehen, ob das Programm Adminrechte hat. Hier ist der relevante Teil des Client-Code:Python pythonw Subprozess check_output funktioniert nicht

computername = subprocess.check_output("echo %computername%", shell=True).decode(sys.stdout.encoding).splitlines()[0] 
username = subprocess.check_output("echo %username%", shell=True).decode(sys.stdout.encoding).splitlines()[0] 
isadmin = ctypes.windll.shell32.IsUserAnAdmin() 
sleep(0.5) 
s.send(computername.encode() + ";;".encode() + username.encode() + ";;".encode() + str(isadmin).encode()) 

Und das ist das Stück von Server-Code, der angenommen hat, um es zu empfangen:

data = conn.recv(1024).decode().split(";;") 
print(data) 
clientcount += 1 
clientlist.append({"conn": conn, "ip": ip, "id": clientcount, "name": data[0] + "\\" + data[1], "isadmin": int(data[2])}) 

(die Druckzeile ist nur für debug) Also hier ist die Problem. Wenn ich den Client-Code als client.py ausführen, alles normal funktioniert, bekomme ich diese Ausgabe:

['DESKTOP-#######', '######', '0']

und der Code kann weiter gehen. Aber wenn ich das Programm als client.pyw ausführen, wie es angenommen hat, zu sein, die ich erhalten:

['']

Also ich natürlich einen Indexerror bekommen. Ich vermute, etwas schief geht mit dem Subprozess.check_output. Es ist normal? Mit was könnte ich es ersetzen, so dass es im Hintergrund funktioniert?

(Ich verwende Python 3.5)

Dank

Antwort

1

.pyw nicht über eine Konsole, so dass es ein Problem mit subprocess wenn pythonw ohne Umleitung von stdin läuft (wie im Duplikat erklärte, dass ich nur ausgegraben).

In Ihrem Fall löst das Hinzufügen von stdin=subprocess.PIPE,stderr=subprocess.STDOUT das Problem, indem gültige Streams für die Eingabe & Fehler zur Verfügung gestellt werden.

Aber vor allem:

subprocess.check_output("echo %computername%", shell=True).decode(sys.stdout.encoding).splitlines()[0] 

für

os.getenv("computername") 

wirklich viel des Guten ist, dass das mit pythonw arbeiten, dass dies tun, dann ist es sauberer, und es wird auf jeden Fall Ihr Problem lösen.

+0

Nehmen wir an, du würdest français vu ton nom, ça tombe bien, moi aussi ^^. Haha, quel idiot, j'avais complètement oublié os.getenv == ". Je vais utiliser ça, mais sinon, j'ai résolu mon proplème. C'était eine Ursache du sys.stdout.encoding, vu que c'est de arrière plan il n'y a pas de stdout ^^ ". Sans ça ça marche, mais je vais quand même utiliser os.getenv(), plus sauber. Merci! – Alpha

+0

oui, c'est mieux! Ja, es ist besser. –

Verwandte Themen