Python-Subprocess.Popen () mit Pygame, wie man sagt, Pygame warten, bis Subprocess getan ist

Ich habe ein großes Problem, das zu viele Pygame-Benutzer hat, ich möchte die Eingabe von Benutzer in Pygame nehmen. Ich verstehe wahrscheinlich alle Informationen im Internet, inklusive Stackoverflow, nichts gelöst.

Also habe ich beschlossen, eine Lösung zu machen, ich habe ein anderes Python-Skript erstellt (ich konvertiere es in .exe, so dass Unterprozeß es öffnen kann), das Frage an Benutzer anfordert, bevor Pygame läuft, danach dann das Skript, das die Benutzerdaten in eine .txt-Datei speichert (wie Eine Datenbank). Dann in Pygame Ich öffne die. Txt-Datei und die Daten. Therocial funktioniert es, aber das Problem ist, ich muss Pygame erzählen, während Unterprozeß verarbeitet wird, warte darauf. So kann ich Fehler wie IndexError ausweichen. Weil ich readlines () verwende und bis diese .exe-Datei geschlossen ist, muss Pygame warten, wenn nicht; Readlines () geben Daten als Liste und es werfen IndexError normal. Also muss Pygame warten, bis ich die Daten in die .exe-Datei gelegt habe. Lass mich mit meinen codes erklären;

Dies ist das Skript, das Daten von Benutzer (ich konvertiert es zu exe bereits so subprocess kann öffnen):

#!/usr/bin/env python # -*-coding:utf-8-*- while True: user=input("Please enter your name: ") try: user_age=int(input("Please enter your age: ")) except ValueError: print ("Invalid characters for 'age', try again.") continue ask_conf=input("Are you confirm these informations?(Y/N): ") if ask_conf.lower()=="y": with open("informations.txt","w") as f: #create the file f.write(user+"\n") f.write(str(user_age)) break else: continue 

Und dann, in Pygame, ich öffne diese .exe-Datei, aber Pygame wird nicht warten und normalerweise bekomme ich Fehler.

 pygame.init() subprocess.Popen(["wtf.exe"]) #the exe file that taking data from user #and saving it in "informations.txt" #codes.. .... .... author = pygame.font.SysFont("comicsansms",25) with open("informations.txt") as f: rd=f.readlines() author1 = author.render("{}".format(rd[0][0:-1]),True,blue) #Pygame won't wait #so getting IndexError here age = pygame.font.SysFont("comicsansms",25) age1 = age.render("{}".format(rd[1]),True,blue) ... ... ... gameDisplay.blit(author1,(680,15)) gameDisplay.blit(age1,(720,40)) 

Diese Methode funktioniert fast, ich dachte schließlich, dass ich die Lösung dieses Eingabeproblems in Pygame bekam. Aber ich weiß nicht, wie man Pygame erzählt, warten Sie, bis ich mit der .exe-Datei fertig bin, dann verarbeiten Sie Ihre Codes.

One Solution collect form web for “Python-Subprocess.Popen () mit Pygame, wie man sagt, Pygame warten, bis Subprocess getan ist”

Verwenden Sie die Kommunikationsmethode :

Interaktion mit dem Prozess: Daten an stdin senden Lesen Sie Daten von stdout und stderr, bis end-of-file erreicht ist. Warten, bis der Prozess beendet wird. Das optionale Eingabeargument sollte ein String sein, der an den untergeordneten Prozess gesendet werden soll, oder Keine, wenn keine Daten an das untergeordnete Element gesendet werden sollen.

Also das ist der Code, um es zu tun:

 process = subprocess.Popen(["wtf.exe"]) # block until process done output, errors = process.communicate() 

Bearbeiten:

Wie @Padraic vorschlägt, können Sie check_call verwenden , was bei dem Ausfall noch informativer ist :

 try: subprocess.check_call(['wtf.exe']) except subprocess.CalledProcessError: pass # handle errors in the called executable except OSError: pass # executable not found 

Eine weitere Option ist:

Führen Sie den von args beschriebenen Befehl aus. Warten Sie, bis der Befehl abgeschlossen ist, und geben Sie dann das returncode-Attribut zurück.

So etwas wie dieses:

 returncode = subprocess.call(["wtf.exe"]) 

Und Sie können auch warten, wenn Sie sich nicht um die Daten kümmern und wollen einfach nur die Rückkehr Code zu sehen, ob etwas Schlimmes passiert ist. Aber die Dokumentation sagt, dass Sie lieber communicate :

Warnung: Das wird bei der Verwendung von stdout = PIPE und / oder stderr = PIPE sperren, und der untergeordnete Prozess erzeugt genügend Ausgabe an eine Pipe, so dass er das Warten auf den OS-Pufferpuffer blockiert, um mehr Daten zu übernehmen. Verwenden Sie communicate (), um das zu vermeiden.

  • Verbinden Sie mit FTP TLS 1.2 Server mit ftplib
  • Python: Typeerror: Nicht leeres Formatstring an Objekt übergeben .__ Format__
  • Bevorzugte Blockgröße beim Lesen / Schreiben großer Binärdateien
  • SyntaxError mit übergeben ** kwargs und folgendes Komma
  • Python importieren mehrmals
  • Countdown Uhr: 01:05
  • Wie man ein Python-Skript mit Argumenten aus der Java-Klasse anruft
  • Python 3 datetime.fromtimestamp scheitert um 1 Mikrosekunde
  • Installiere django1.7 mit Python 3.4 mit virtualenv
  • Wie könnte ich Anfragen in asyncio verwenden?
  • Kein Modul namens 'openpyxl' - Python 3.4 - Ubuntu
  • Python ist die beste Programmiersprache der Welt.