4 Больше гибкости с Popen

Использование subprocess.Popen дает более мелкозернистую контроль над запущенными процессами , чем subprocess.call .

Запуск подпроцесса

 process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])

 

Сигнатура Popen очень похожа на call функцию; Однако, Popen немедленно вернуться вместо того , чтобы ждать подпроцесса для завершения , как call делает.

Ожидание завершения подпроцесса

 process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
process.wait()

 

Чтение вывода из подпроцесса

 process = subprocess.Popen([r'C:\path\to\app.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# This will block until process completes
stdout, stderr = process.communicate()
print stdout
print stderr

 

Интерактивный доступ к запущенным подпроцессам

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

Запись в подпроцесс

 process = subprocess.Popen([r'C:\path\to\app.exe'], stdout = subprocess.PIPE, stdin = subprocess.PIPE)


process.stdin.write('line of input\n') # Write input

line  = process.stdout.readline() # Read a line from stdout

# Do logic on line read.

 

Тем не менее, если вам нужно только один набор входных и выходных, а не динамическое взаимодействие, вы должны использовать communicate() , а не прямой доступом stdin и stdout .

Чтение потока из подпроцесса

Если вы хотите видеть вывод подпроцесса построчно, вы можете использовать следующий фрагмент:

 process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
    output_line = process.stdout.readline()

 

в случае, если выходные данные подкоманды не имеют символа EOL, приведенный выше фрагмент не работает. Затем вы можете прочитать вывод за символом следующим образом:

 process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
    output_line = process.stdout.read(1)

 

1 указывается в качестве аргумента к read методу говорит чтение для чтения 1 знака времени. Вы можете указать, чтобы прочитать столько символов, сколько вы хотите, используя другой номер. Отрицательное число или 0 указывает на read для чтения в виде одной строки до EOF не встречается ( см здесь ).

В обоих указанных выше фрагментов, то process.poll() не является None до подпроцесса отделки. Это используется для выхода из цикла, когда больше нет выходных данных для чтения.

Же процедура может быть применена к stderr подпроцесса.