Тема содержания:
- Запустите простую команду Linux
- Запуск команды с входными данными
- Запустите скрипт Python
- Обработка ошибки подпроцесса
- Вернуть код Subprocess.Popen
- Перенаправить вывод подпроцесса в файл
- Многопроцессорность с использованием Subprocess.Popen
- Обработка входного и выходного потока с
- Контролируйте тайм-аут и задержку
- Чтение потокового ввода
Запустите простую команду Linux
Команда «дата» используется для отображения текущей системной даты и времени. Создайте файл Python с помощью следующего сценария, который создает подпроцесс, выполняющий команду «дата», и распечатайте выходные данные этой команды:
#Импортируем модульИмпортировать подпроцесс
#Определяем команду для подпроцесса и
#open процесс с использованием функции Popen()
выход '=' подпроцесс . Попен ( [ 'дата' ] , стандартный вывод '=' подпроцесс . ТРУБКА )
#Получаем выходные данные и ошибки, общаясь с процессом
стандартный вывод , stderr '=' выход. общаться ( )
#Распечатываем результат
Распечатать ( стандартный вывод. декодировать ( ) )
Выход:
После выполнения предыдущего скрипта появится следующий вывод:
Запуск команды с входными данными
Команда «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» принимается в качестве входных данных и является допустимой командой:
Следующий вывод появляется, если команда «usr» принимается в качестве входных данных и является допустимой командой:
Вернуть код 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 узнать основные способы использования этой функции.