Python subprocess.Popen () с Pygame, как сказать Pygame ждать до тех пор, пока не будет выполняться подпроцесс

У меня есть серьезная проблема, с которой слишком много пользователей Pygame, я хочу взять данные от пользователя в Pygame. Я, вероятно, проверяю всю информацию в Интернете, включая stackoverflow, ничего не решает.

Поэтому я решил сделать решение, я создал еще один скрипт Python (я его конвертирую в .exe, так что подпроцесс может его открыть), который задает вопрос пользователю перед запуском Pygame, после чего этот скрипт сохраняет данные пользователя в файл .txt (например, база данных). Затем в Pygame я открываю этот .txt-файл и беру данные. В основном это работает, но проблема в том, что я должен сказать Pygame, в то время как подпроцесс обрабатывается, дожидаясь его. Вот как я могу уклониться от ошибок, таких как IndexError и т. Д. Поскольку я использую readlines () и до тех пор, пока этот .exe-файл не будет закрыт, Pygame должен ждать, если нет; readlines (), предоставляя данные в виде списка, и он обычно бросает IndexError. Поэтому Pygame должен ждать, пока я не поместил данные в этот .exe-файл. Позвольте мне объяснить мои коды;

Это сценарий, который принимает данные от пользователя (я преобразовал его в exe, так что подпроцесс может открыться):

#!/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 

И затем, в Pygame, я открываю этот .exe-файл, но Pygame не будет ждать, и обычно я получаю ошибку.

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

Этот метод почти работает, я подумал, что в конце концов я получил решение этой проблемы ввода в Pygame. Но я не знаю, как сказать Pygame, подождите, пока я не закончил с .exe-файлом, а затем обработаю ваши коды.

One Solution collect form web for “Python subprocess.Popen () с Pygame, как сказать Pygame ждать до тех пор, пока не будет выполняться подпроцесс”

Используйте метод связи :

Взаимодействие с процессом: отправка данных в stdin. Чтение данных из stdout и stderr, пока не будет достигнут конец файла. Подождите, пока процесс завершится. Необязательный входной аргумент должен быть строкой, которая должна быть отправлена ​​дочернему процессу, или Нет, если никакие данные не должны быть отправлены ребенку.

Итак, это код для этого:

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

Редактировать:

Как предлагает @Padraic, вы можете использовать check_call , который более информативен при сбое :

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

Другим вариантом является вызов :

Выполните команду, описанную args. Дождитесь завершения команды, а затем верните атрибут returncode.

Так что-то вроде этого:

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

И вы также можете использовать wait, если вам не нужны данные, и просто хотите, чтобы код возврата отображал, произошло ли что-то плохое. Но в документации говорится, что вы предпочитаете communicate :

Предупреждение: это будет заторможен при использовании stdout = PIPE и / или stderr = PIPE, а дочерний процесс генерирует достаточный вывод в канал таким образом, что он блокирует ожидание буфера для буфера OS, чтобы принимать больше данных. Используйте сообщение (), чтобы избежать этого.

  • Как получить ввод от пользователя в Pygame и сохранить его как переменную?
  • Запись фрейма данных pandas в таблицу документов Word через pywin32
  • Итерирование через asyncio.coroutine
  • Как эмулировать socket.socketpair в Windows
  • Установка pyaudio на mac (python 3)
  • фотографирование веб-камеры в python 3 и windows
  • Импортировать изображение с помощью подушки: нет модуля с именем «PIL»
  • Нет двоичного файла pip после установки Python 3.4.2 на Centos 6.5
  • Python - лучший язык программирования в мире.