Примеры Python Subprocess.Popen

Primery Python Subprocess Popen



Подпроцесс Python — это один из полезных модулей, который используется для запуска различных команд оболочки, процессов и выполнения другого сценария или исполняемых файлов с использованием сценария Python. Его также можно использовать для перенаправления данных из одного процесса в другой и обработки ошибок, генерируемых дочерними процессами. Модуль подпроцесса имеет множество классов, которые используются для различных целей. Класс «subprocess.Popen» — это один из классов этого модуля, который используется для взаимодействия с внешними процессами и выполнения различных типов задач между процессами. В этом руководстве показано многократное использование класса «subprocess.Popen» в скрипте Python.

Тема содержания:

  1. Запустите простую команду Linux
  2. Запуск команды с входными данными
  3. Запустите скрипт Python
  4. Обработка ошибки подпроцесса
  5. Вернуть код Subprocess.Popen
  6. Перенаправить вывод подпроцесса в файл
  7. Многопроцессорность с использованием Subprocess.Popen
  8. Обработка входного и выходного потока с
  9. Контролируйте тайм-аут и задержку
  10. Чтение потокового ввода

Запустите простую команду Linux

Команда «дата» используется для отображения текущей системной даты и времени. Создайте файл Python с помощью следующего сценария, который создает подпроцесс, выполняющий команду «дата», и распечатайте выходные данные этой команды:

#Импортируем модуль

Импортировать подпроцесс

#Определяем команду для подпроцесса и

#open процесс с использованием функции Popen()

выход '=' подпроцесс . Попен ( [ 'дата' ] , стандартный вывод '=' подпроцесс . ТРУБКА )

#Получаем выходные данные и ошибки, общаясь с процессом

стандартный вывод , stderr '=' выход. общаться ( )

#Распечатываем результат

Распечатать ( стандартный вывод. декодировать ( ) )

Выход:







После выполнения предыдущего скрипта появится следующий вывод:



  п1



Перейти наверх





Запуск команды с входными данными

Команда «wc» с опцией «-c» используется для подсчета общего количества символов строкового значения, предоставленного этой командой. Создайте файл Python с помощью следующего сценария, который создает подпроцесс с функцией Popen() для запуска команд «wc –c». Строковое значение берется из терминала после выполнения скрипта, а общее количество символов входной строки выводится на выходе.

#Импортируем модуль

Импортировать подпроцесс

#Определяем команду для подпроцесса и

#Открыть процесс с помощью функции Popen()

выход '=' подпроцесс . Попен ( [ 'Туалет' , '-с' ] , стандартный вывод '=' подпроцесс . ТРУБКА )

#Получаем выходные данные и ошибки, общаясь с процессом

стандартный вывод , stderr '=' выход. общаться ( )

#Распечатываем результат

Распечатать ( стандартный вывод. декодировать ( ) )

Выход:



Для входного значения «Примеры подпроцесса Python» отображается следующий вывод:

Перейти наверх

Запустите скрипт Python

Создайте файл Python с именем «sum.py» с помощью следующего сценария, который вычисляет сумму двух чисел, и эти числа предоставляются в качестве аргументов командной строки:

sum.py

#Импортируем необходимый модуль

Импортировать система

#Подсчитаем общее количество аргументов

н '=' только ( система . аргв )

#Добавляем первые два значения аргумента

сумма '=' интервал ( система . аргв [ 1 ] ) + интервал ( система . аргв [ 2 ] )

#Распечатываем результат сложения

Распечатать ( 'Сумма ' + система . аргв [ 1 ] + ' и ' + система . аргв [ 2 ] + ' является' , сумма )

Создать Python файл с следующий скрипт, который запустит Python файл названный сумма . пи с два аргумента, создав подпроцесс .

#Импортируем модуль

Импортировать подпроцесс

#Запускаем скрипт Python в подпроцессе и

#открываем процесс с помощью функции Popen()

выход '=' подпроцесс . Попен ( [ 'питон3' , 'сумма.py' , '25' , '55' ] , стандартный вывод '=' подпроцесс . ТРУБКА ) #Получаем выходные данные и ошибки, общаясь с процессом

стандартный вывод , stderr '=' выход. общаться ( )

#Распечатываем результат

Распечатать ( стандартный вывод. декодировать ( ) )

Выход:

После выполнения предыдущего скрипта появится следующий вывод:

Перейти наверх

`

Обработка ошибки подпроцесса

Создайте файл Python со следующим сценарием, который обрабатывает ошибки подпроцесса с помощью блока «try-Exception». Команда берется у пользователя и выполняется подпроцессом. Сообщение об ошибке отображается, если от пользователя получена недопустимая команда.

#Импортируем модули

Импортировать подпроцесс

Импортировать система

#Принимаем команду от пользователя

команда '=' вход ( 'Введите действительную команду: ' )

пытаться :

#Открыть процесс с помощью функции Popen()

выход '=' подпроцесс . Попен ( [ команда ] , стандартный вывод '=' подпроцесс . ТРУБКА )

#Получаем выходные данные и ошибки, общаясь с процессом

стандартный вывод , stderr '=' выход. общаться ( )

#Распечатываем результат

Распечатать ( стандартный вывод. декодировать ( ) )

кроме :

Распечатать ( 'Ошибка:' , система . exc_info ( ) )

Выход:

Следующий вывод появляется, если команда «pwd» принимается в качестве входных данных и является допустимой командой:

  п4-1

Следующий вывод появляется, если команда «usr» принимается в качестве входных данных и является допустимой командой:

  п4-2

Перейти наверх

Вернуть код Subprocess.Popen

Создайте файл Python с помощью следующего сценария, который выполняет команду «ls» через подпроцесс, чтобы получить список всех файлов Python из текущего местоположения. Сценарий ожидает завершения подпроцесса и печатает код возврата.

#Импортируем модули

Импортировать подпроцесс

Импортировать система

#Задаем команду

команда '=' [ 'лс' , '-л' , '*.py' ]

пытаться :

#Открыть процесс с помощью функции Popen()

выход '=' подпроцесс . Попен ( команда , стандартный вывод '=' подпроцесс . ТРУБКА ,

stderr '=' подпроцесс . ТРУБКА , текст '=' Истинный )

#Подождите завершения процесса

реткод '=' выход. ждать ( )

#Распечатываем код возврата

Распечатать ( «Код возврата:» , реткод )

кроме :

#Распечатать сообщение об ошибке, если

Распечатать ( 'Ошибка:' , система . exc_info ( ) )

Выход:

Аналогичный вывод появляется после выполнения предыдущего скрипта:

Перейти наверх

Перенаправить вывод подпроцесса в файл

Создайте файл Python с помощью следующего сценария, который записывает выходные данные подпроцесса в текстовый файл. Команда, которую выполняет подпроцесс, берется у пользователя.

#Импортировать модуль

Импортировать подпроцесс

#Определяем имя файла

имя файла '=' 'outfile.txt'

#Принимаем команду ping

cmd '=' вход ( 'Введите команду ping: ' )

#Разделяем введенные данные по пробелу

аргументы '=' cmd . расколоть ( )

#Записываем вывод команды в файл

с открыть ( имя файла , 'В' ) как устаревшие данные:

процесс '=' подпроцесс . Попен ( аргументы , стандартный вывод '=' устаревшие данные )

#Дождитесь завершения процесса

код возврата '=' процесс. ждать ( )

Выход:

Согласно следующему выводу, команда «ping -c 3 www.google.com Команда «» берется у пользователя, а команда «cat» используется для отображения содержимого файла, записанного подпроцессом:

Перейти наверх

Многопроцессорная обработка с использованием Subprocess.Popen

Создайте файл Python со следующим сценарием, в котором использование многопроцессорности показано с помощью subprocess. Здесь функция с именем display_msg() вызывается несколько раз с использованием многопроцессорной обработки.

#Импортируем необходимые модули

Импортировать многопроцессорность

Импортировать подпроцесс

#Определяем функцию, которая будет вызываться многопроцессорной обработкой

защита display_msg ( н ) :

#Определяем команду с помощью функции format()

cmd '=' 'эхо 'Программирование на Python'' . формат ( н )

#Открыть процесс с помощью функции Popen()

процесс '=' подпроцесс . Попен ( cmd , оболочка '=' Истинный , стандартный вывод '=' подпроцесс . ТРУБКА )

#Получаем выходные данные и ошибки, общаясь с процессом

стандартный вывод , ошибка '=' процесс. общаться ( )

#Распечатываем результат

Распечатать ( стандартный вывод. декодировать ( ) )

#Вызовите функцию 5 раз, создав multiprocessing.Pool

с многопроцессорность. Бассейн ( многопроцессорность. cpu_count ( ) ) как МП:

#Сопоставление функции

МП. карта ( display_msg , диапазон ( 1 , 5 ) )

Выход:

После выполнения предыдущего скрипта появится следующий вывод:

Перейти наверх

Обработка потоков ввода и вывода

Прежде чем создавать сценарий Python в этом примере, создайте текстовый файл с именем «test.txt» со следующим содержимым.

test.txt

ПЕРЛ

питон

бить

php

Создайте файл Python с помощью следующего сценария, который использует один подпроцесс для чтения содержимого файла «test.txt», а другой — для поиска определенного слова в этом текстовом файле. Здесь слово «python» ищется в «файле test.txt», содержащем это слово.

#Импортировать модули

Импортировать подпроцесс

#Определяем процесс для входного потока

в процессе '=' подпроцесс . Попен ( [ 'кот' , 'тест.txt' ] , стандартный вывод '=' подпроцесс . ТРУБКА , текст '=' Тру > #Определяем процесс для выходного потока

out_process '=' подпроцесс . Попен (

[ 'схватить' , 'питон' ] , стандартный ввод '=' в процессе. стандартный вывод ,

стандартный вывод '=' подпроцесс . ТРУБКА , текст '=' Истинный )

#Сохраняем выходные данные процессов ввода и вывода

выход , _ '=' out_process. общаться ( )

#Распечатываем результат

Распечатать ( 'Выход:' , выход )

Выход:

После выполнения скрипта появится следующий вывод:

Перейти наверх

Управляйте подпроцессом с помощью таймера

Создайте файл Python с помощью следующего сценария, который использует таймер для выполнения команды с использованием подпроцесса. Здесь блок «try-Exception» используется для запуска таймера, а блок «finally» используется для отмены таймера.

#Импортируем модуль подпроцесса

Импортировать подпроцесс

#Импортируем модуль таймера

от резьба Импортировать Таймер

#Определяем команду

cmd '=' [ 'пинг' , 'www.example.com' ]

#Открываем процесс

п '=' подпроцесс . Попен (

cmd , стандартный вывод '=' подпроцесс . ТРУБКА , stderr '=' подпроцесс . ТРУБКА )

#Определяем таймер

таймер '=' Таймер ( 2 , лямбда процесс: процесс. убийство ( ) , [ п ] )

пытаться :

#Запускаем таймер

таймер. начинать ( )

#Читать вывод

стандартный вывод , _ '=' п. общаться ( )

#Вывод на печать

Распечатать ( стандартный вывод. декодировать ( ) )

кроме :

#Распечатать сообщение об ошибке, если

Распечатать ( 'Ошибка:' , система . exc_info ( ) )

окончательно :

#Остановить таймер

таймер. отмена ( )

Выход:

После выполнения скрипта появится следующий вывод:

Перейти наверх

Прочтите потоковые данные

Создайте файл Python, который считывает содержимое вывода подпроцесса с помощью цикла while и сохраняет содержимое в переменную. Содержимое этой переменной выводится позже. Здесь команда «curl» используется в подпроцессе для www.google.com URL-адрес.

#Импортировать модуль

Импортировать подпроцесс

#Определить команду

cmd '=' [ 'завиток' , 'www.example.com' ]

п '=' подпроцесс . Попен ( cmd , стандартный вывод '=' подпроцесс . ТРУБКА ,

stderr '=' подпроцесс . ТРУБКА , текст '=' Истинный >

#Инициализируем выходную переменную

выход '=' ''

пока Истинный :

#Читаем вывод процесса построчно

Ин '=' п. стандартный вывод . линия чтения ( )

#Выходим из цикла после завершения подпроцесса

если нет пер:

перерыв

выход '=' выход + ln

#Распечатываем строку

Распечатать ( выход )

#Получите код возврата после завершения процесса

код возврата '=' п. ждать ( )

#Распечатываем код возврата

Распечатать ( 'Код возврата: ' , код возврата )

Выход:

Последняя часть трех выходных данных показана на следующем изображении. Код возврата после завершения подпроцесса равен 0:

Перейти наверх

Заключение

В этом руководстве показаны различные варианты использования подпроцесса Python.Popen() с использованием нескольких сценариев Python, которые помогут пользователям Python узнать основные способы использования этой функции.