2017-10-04 9 views
1

J'ai un problème concernant pythonw. Je fais un programme qui devrait être exécuté en arrière-plan. Quand il commence, il est supposé envoyer le nom d'ordinateur, le nom d'utilisateur et le résultat d'une vérification pour voir si le programme a des droits d'administrateur. Voici la pièce correspondante du code client:Sous-processus pythonw Python check_output ne fonctionne pas

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

Et c'est le morceau de code du serveur qui est censé recevoir:

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])}) 

(la ligne d'impression est juste pour le débogage) est donc ici la problème. Lorsque j'exécute le code client comme client.py, tout fonctionne normalement, je reçois cette sortie:

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

et le code peut continuer. Mais quand j'exécute le programme client.pyw, comme il est censé être, je reçois:

['']

Alors bien sûr, je reçois un IndexError. Je suppose que quelque chose ne va pas avec le subprocess.check_output. Est-ce normal? Avec quoi pourrais-je le remplacer, donc ça marche en arrière-plan?

(j'utilise python 3.5)

Merci

Répondre

1

.pyw n'a pas une console, donc il y a un problème avec subprocess lors de l'exécution pythonw sans redirection de stdin (comme expliqué dans le double que je juste creusé).

Dans votre cas, l'ajout de stdin=subprocess.PIPE,stderr=subprocess.STDOUT résout le problème en fournissant des flux valides pour les erreurs d'entrée &.

Mais surtout:

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

est vraiment surpuissant pour

os.getenv("computername") 

que cela fonctionnera avec pythonw donc faire, il est plus propre, et il va certainement résoudre votre problème.

+0

Je suppose que tu est français vu ton nom, ça tombe bien, moi aussi ^^. Haha, quel idiot, j'ai complètement oublié os.getenv == "Je vais utiliser ça, mais sinon, j'ai résolu mon problème.était une cause du sys.stdout.encoding, vu que c'était arrière plan il n'y a pas de stdout ^^ ". Sans ça marche, mais je vais quand même utiliser os.getenv(), plus propre. Merci! – Alpha

+0

oui, c'est mieux! Oui c'est mieux. –