Python зависает при запуске exe-файла

#python #cygwin

Вопрос:

Я делаю простой графический интерфейс python, и при нажатии кнопки он выполнит простую команду:

 os.system("C:/cygwin64/bin/bash.exe")
 

Когда я смотрю в консоль, она работает правильно, но мой парень зависает и не отвечает.
Если я выполняю команду the в консоли без python, она отлично работает, и я запускаю терминал cygwin.

Если вы знаете, что такое cygwin, есть ли лучший способ запустить его в том же терминале?

Ответ №1:

os.system блокирует текущий поток, который вы можете использовать os.popen для этого в другом потоке, а также дает вам несколько методов для отсоединения/чтения/записи и т. Д. Этого процесса. например,

 import os
a = os.popen("python -c 'while True: print(1)'")
 

создаст новый процесс, который будет завершен, как только вы завершите свой сценарий.
вы можете сделать

 for i in a:
    print(i)
 

например, и он заблокирует поток, как os.system это делает.
вы можете a.detach() сделать это всякий раз, когда захотите завершить процесс.

Однако, os.system

 import os
os.system("python -c 'while True: print(1)'")
 

он будет выводить 1s вечно, пока вы не завершите сценарий.

Ответ №2:

Вы можете использовать функцию Popen в пакете subprocess . У него есть множество возможных аргументов, которые позволяют передавать входные данные и/или выходные данные из программы, которую вы запускаете. Но если вы просто хотите выполнить bash.exe , позволяя вашей оригинальной программе Python продолжать работать и в конечном итоге дождаться завершения bash.exe , то:

 import subprocess

# pass a list of command-line arguments:
p = subprocess.Popen(["C:/cygwin64/bin/bash.exe"])

... # continue executing

# wait for the subprocess (bash.exe) to end:
exit_code = p.wait()