Python

Как выполнять команды оболочки в Python с помощью метода запуска подпроцесса

Как выполнять команды оболочки в Python с помощью метода запуска подпроцесса
Подпроцесс - это встроенный модуль Python, который можно использовать для создания новых процессов и взаимодействия с их потоками входных и выходных данных. Проще говоря, вы можете использовать его для выполнения команд оболочки и запуска исполняемых двоичных файлов, обычно разбросанных по различным папкам «bin» в файловой системе Linux. Вы также можете указать полный путь к исполняемому двоичному файлу и использовать любые параметры командной строки, связанные с двоичным файлом. В этой статье объясняется, как использовать модуль подпроцесса и его метод запуска в приложениях Python. Все примеры кода в статье протестированы на Python 3.8.2 в Ubuntu 20.04.

Подпроцесс.запустить метод

Подпроцесс.метод run принимает список аргументов. Когда метод вызывается, он выполняет команду и ожидает завершения процесса, возвращая в конце объект «CompletedProcess». Объект CompletedProcess возвращает stdout, stderr, исходные аргументы, использованные при вызове метода, и код возврата. Stdout относится к потоку данных, создаваемому командой, а stderr относится к любым ошибкам, возникающим во время выполнения программы. Любой ненулевой код возврата (код выхода) будет означать ошибку с командой, выполненной в подпроцессе.метод запуска.

Пример 1: Вывод содержимого текстового файла с помощью подпроцесса.запустить метод

Приведенная ниже команда выведет содержимое «данных.txt », предполагая, что он содержит строку« name = John ».

подпроцесс импорта
подпроцесс.run (["кот", "данные.текст"])

Выполнение приведенного выше кода вернет следующий результат:

name = Джон
CompletedProcess (args = ['cat', 'data.txt '], код возврата = 0)

Первый элемент аргумента списка - это имя выполняемой команды. Любой элемент в списке, следующий за первым элементом, считается параметрами или переключателями командной строки. Вы также можете использовать одинарное тире и двойное тире для определения параметров. Например, чтобы вывести список файлов и папок в каталоге, используйте код «подпроцесс».run ([«ls», «-l»] ». В большинстве этих случаев вы можете рассматривать любой аргумент, разделенный пробелами в команде оболочки, как отдельный элемент в списке, предоставляемом подпроцессу.метод запуска.

Пример 2: Подавить вывод подпроцесса.запустить метод

Чтобы подавить вывод подпроцесса.run, вам нужно будет указать «stdout = subprocess.DEVNULL »и« stderr = subprocess.DEVNULL »в качестве дополнительных аргументов.

подпроцесс импорта
подпроцесс.run (["кот", "данные.txt "], stdout = подпроцесс.DEVNULL,
stderr = подпроцесс.DEVNULL)

Выполнение приведенного выше кода приведет к следующему результату:

CompletedProcess (args = ['cat', 'data.txt '], код возврата = 0)

Пример 3: захват вывода подпроцесса.запустить метод

Чтобы захватить вывод подпроцесса.run, используйте дополнительный аргумент с именем «capture_output = True».

подпроцесс импорта
output = subprocess.run (["кот", "данные.txt "], capture_output = True)
печать (вывод)

Выполнение приведенного выше кода приведет к следующему результату:

CompletedProcess (args = ['cat', 'data.txt '], код возврата = 0,
stdout = b'name = Джон \ n ', stderr = b ")

Вы можете получить индивидуальный доступ к значениям stdout и stderr, используя «output.stdout »и« вывод ».stderr »методы. Вывод создается как последовательность байтов. Чтобы получить строку в качестве вывода, используйте «output.стандартный вывод.decode («utf-8») »метод. Вы также можете указать «text = True» в качестве дополнительного аргумента для подпроцесса.запустить вызов, чтобы получить вывод в строковом формате. Чтобы получить код статуса выхода, вы можете использовать «output.код возврата »метод.

Пример 4: Исключение при сбое команды, выполненной подпроцессом.запустить метод

Чтобы вызвать исключение, когда команда завершается с ненулевым статусом, используйте аргумент «check = True».

подпроцесс импорта
подпроцесс.run (["кот", "данные.tx "], capture_output = True, text = True, check = True)

Выполнение приведенного выше кода приведет к следующему результату:

поднять CalledProcessError (код возврата, процесс.аргументы,
подпроцесс.CalledProcessError: команда '[' кошка ',' данные.tx ']'
возвращен ненулевой статус выхода 1.

Пример 5: передать строку команде, выполняемой подпроцессом.запустить метод

Вы можете передать строку команде, которая будет выполняться подпроцессом.запустить метод с использованием аргумента «input = 'string'».

подпроцесс импорта
output = subprocess.run (["cat"], input = "data.txt ", capture_output = True,
text = True, check = True)
печать (вывод)

Выполнение приведенного выше кода приведет к следующему результату:

CompletedProcess (args = ['cat'], returncode = 0, stdout = "data.txt ", stderr =")

Как видите, приведенный выше код передает «данные.txt »как строку, а не как файловый объект. Чтобы передать «данные.txt »в качестве файла, используйте аргумент« stdin ».

с открытыми ("данными.txt ") как f:
output = subprocess.run (["кот"], stdin = f, capture_output = True,
text = True, check = True)
печать (вывод)

Выполнение приведенного выше кода приведет к следующему результату:

CompletedProcess (args = ['cat'], returncode = 0, stdout = "name = John \ n", stderr = ")

Пример 6: Выполнение команды непосредственно в оболочке с помощью подпроцесса.запустить метод

Можно запустить команду непосредственно в оболочке «как есть» вместо использования разбиения строки в основной команде и следующих за ней опциях. Для этого вы должны передать «shell = True» в качестве дополнительного аргумента. Однако разработчики python не одобряют это, поскольку использование «shell = True» может привести к проблемам с безопасностью. Вы можете узнать больше о последствиях для безопасности здесь.

подпроцесс импорта
подпроцесс.run ("данные кошки".txt '", shell = True)

Выполнение приведенного выше кода приведет к следующему результату:

name = Джон

Заключение

Подпроцесс.Метод run в Python довольно мощный, так как он позволяет запускать команды оболочки внутри самого Python. Это помогает ограничить весь код самим Python без необходимости иметь дополнительный код сценария оболочки в отдельных файлах. Однако может быть довольно сложно правильно токенизировать команды оболочки в списке Python. Вы можете использовать «шлекс».split () »для токенизации простых команд оболочки, но в длинных сложных командах - особенно с символами вертикальной черты - shlex не может правильно разделить команду. В таких случаях отладка может быть сложной задачей. Вы можете использовать аргумент «shell = True», чтобы избежать этого, но есть определенные проблемы безопасности, связанные с этим действием.

Курсор прыгает или перемещается случайным образом при наборе текста в Windows 10
Если вы обнаружите, что ваш курсор мыши прыгает или перемещается сам по себе, автоматически, случайным образом при вводе текста на ноутбуке или компью...
Как изменить направление прокрутки мыши и сенсорной панели в Windows 10
Мышь а также Сенсорная панельs не только упрощают вычисления, но и делают их более эффективными и требуют меньше времени. Мы не можем представить себе...
Как изменить указатель мыши и размер курсора, цвет и схему в Windows 10
Указатель мыши и курсор в Windows 10 - очень важные аспекты операционной системы. То же самое можно сказать и о других операционных системах, так что,...