Python выполнить команду windows

Обновлено: 05.07.2024

Как я могу вызвать внешнюю команду (как если бы я набрал ее в командной строке Unix или Windows) из скрипта Python?

посмотреть модуль подпроцесс в стандартной библиотеке:

преимущество подпроцесс и система это то, что он более гибкий (вы можете получить stdout, stderr, "реальный" код состояния, лучшую обработку ошибок и т. д. ).

на официальная документация рекомендует подпроцесс модуль над альтернативной ОС.system ():

в подпроцесс модуль предоставляет более мощные средства для нереста новых процессов и получения их результатов; использование этого модуля предпочтительнее использования этой функции [ os.system() ].

вот краткое изложение способов вызова внешних программ и преимуществ и недостатков каждого из них:

os.system("some_command with args") передает команду и аргументы в оболочку вашей системы. Это хорошо, потому что вы можете запускать несколько команд одновременно таким образом и настраивать каналы и перенаправление ввода/вывода. Например:

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

stream = os.popen("some_command with args") будет делать то же самое как os.system за исключением того, что он дает вам файловый объект, который вы можете использовать для доступа к стандартному входу/выходу для этого процесса. Есть 3 других варианта popen, которые все обрабатывают ввод-вывод немного по-разному. Если вы передаете все как строку, то ваш команда передается в оболочку; если вы передаете их как список, вам не нужно беспокоиться о том, чтобы избежать чего-либо. См.документация.

на Popen класс subprocess модуль. Это предназначено в качестве замены для os.popen но имеет обратную сторону быть немножко более осложненным в силу быть настолько всесторонним. Например, вы скажете:

но приятно иметь все опции там в одном унифицированном классе вместо 4 различных функций popen. См.документация.

на С subprocess модуль. Это просто как Popen class и принимает все те же аргументы, но он просто ждет, пока команда не завершится и не даст вам код возврата. Например:

модуль ОС также имеет все функции fork / exec/spawn, которые у вас были бы в программе на C, но я не рекомендую их использовать непосредственно.

на subprocess модуль, вероятно, должен быть тем, что вы используете.

наконец, обратите внимание, что для всех методов, где вы передаете окончательную команду, которая будет выполняться оболочкой в виде строки, и вы несете ответственность за ее экранирование. есть серьезные последствия для безопасности если какая-либо часть строки, которую вы пройти не можете полностью доверять. Например, если пользователь вводит некоторую / любую часть строки. Если вы не уверены, используйте только эти методы с константами. Чтобы дать вам намек на последствия рассмотрим этот код:

и представьте, что пользователь вводит "моя мама не любила меня & & rm-rf /".

Я обычно использовать:

вы можете делать с stdout данные в трубу. Фактически, вы можете просто опустить эти параметры ( stdout= и stderr= ) и он будет вести себя как os.system() .

некоторые подсказки по отсоединению дочернего процесса от вызывающего (запуск дочернего процесса в фоновом режиме).

Предположим, вы хотите запустить длинную задачу из CGI-скрипта, то есть дочерний процесс должен жить дольше, чем процесс выполнения CGI-скрипта.

классический пример из документов модуля подпроцесса:

идея здесь в том, что вы не хотите ждать в строке "вызов подпроцесса", пока longtask.py все кончено. Но это не ясно, что происходит после строки "еще немного кода здесь" из примера.

моей целевой платформой была freebsd, но разработка была на windows, поэтому сначала я столкнулся с проблемой на windows.

в windows (win xp) родительский процесс не завершится до longtask.py закончил свою работу. Это не то, что вы хотите в CGI-скрипт. Проблема не специфична для Python, в сообществе PHP проблемы одинаковы.

решение пройти DETACHED_PROCESS Флаг Создания Процесса к базовой функции CreateProcess в win API. Если вы установили pywin32, вы можете импортировать флаг из модуля win32process, в противном случае вы должны определить его сами:

/* UPD 2015.10.27 @eryksun в комментарии ниже отмечает, что семантически правильным флагом является CREATE_NEW_CONSOLE (0x00000010) */

на FreeBSD у нас другая проблема: когда родительский процесс законченный, он заканчивает дочерние процессы. И это не то, что вы хотите в CGI-скрипте. Некоторые эксперименты показали, что проблема заключалась в совместном использовании sys.стандартный вывод. А рабочим решением было следующее:--4-->

Я не проверял код на других платформах и не знаю причин поведения на freebsd. Если кто знает, пожалуйста, поделитесь своими идеями. Googling при запуске фоновых процессов в Python еще не проливает свет.

Если вы хотите вернуть результаты команды, вы можете использовать os.popen . Однако это устарело с версии 2.6 в пользу модуль подпроцесс, которые другие ответы покрыли хорошо.

обратите внимание, что это опасно, так как команда не чистить. Я оставляю это до вас в google для соответствующей документации по модулям " os " и "sys". Есть куча функций (exec* и spawn*), которые будут делать похожие вещи.

В этой статье вы узнаете как выполнять команды Linux и Windows из кода на Python 3.

Создайте файл subprocess_lesson.py и копируйте туда код из примеров.

Запустить файл можно командой python3 subprocess.py

Простой пример

Пример программы, которая выполняет Linux команду ls

Простой пример Windows

Пример программы, которая выполняет в Windows команду dir

У меня пока что не работает

Bash команда с опциями

Чтобы выполнить Bash команду с опциями, например, ls - la нужно добавить shell = True

У использования shell = True есть одна важная особенность: нужно особенно внимательно следить за безопастностью.

Рекомендуется использовать shell = True только если вы передаёте параметры самостоятельно.

Избежать использования shell = True можно передав команду и параметры списком:

Передать переменную в аргумент команды

По аналогии с предыдущим параграфом - в качестве аргумента можно использовать и переменную

import subprocess text = "Visit TopBicycle.ru to support my website" subprocess.run([ "echo" , text])

args, returncode, stdout

Разберём subprocess более подробно

Чтобы не выводить результат в терминал а сохранить в переменную, нужно воспользоваться опцией capture_output = True

Если byte вывод вам не нравится его можно декодировать

total 12 drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 . drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 .. -rw-rw-r-- 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py

Или можно использовать опцию text=True

total 12 drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 . drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 .. -rw-rw-r-- 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py

Ещё один вариант перенаправления вывода stdout=subprocess.PIPE

total 12 drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 . drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 .. -rw-rw-r-- 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py

Обработка ошибок

Добавим заведомо неверное условие в команду. Например, пусть листинг выполняется не для текущей директории а для несуществующей.

Обратите внимане, что Python в этом примере не выдаёт никаких ошибок

Чтобы Python информировал об ошибках во внешних командах используйте опцию check = True

Обратите внимане, что теперь Python выдаёт ошибку, а до print(p1.returncode) и print(p1.stderr) дело уже не доходит

Передача аргументов в скрипт

Допустим, нужно вызвать скрипт с несколькими аргументами

Ещё пример: из python скрипта вызвать sed и обрезать число строк, которое сам скрипт получает как аргумент

Эту задачу можно решить на чистом Python решение

Логи с помощью subprocess

Если запускать код в какой-то среде, где лог в файл неудобен а лог с помощью print невозможен, можно использовать echo из bash

import subprocess text = "Andrei Log: robot/src/libraries/TestController.py is running" subprocess.run ([ "echo" , text ])

Сравнить два файла

Если запускать код в какой-то среде, где лог в файл неудобен а лог с помощью print невозможен, можно использовать echo из bash

Возможно, нам потребуется интегрировать функции для выполнения некоторых задач системного администрирования в Python. К ним относятся поиск файлов, выполнение некоторых команд оболочки, выполнение некоторой расширенной обработки файлов и т. д. И для этого нам нужен какой-то способ взаимодействия между системой и интерпретатором Python.

Выполнение командных строк с помощью Python можно легко выполнить с помощью некоторых системных методов из os module .

Но с появлением модуля subprocess (с намерением заменить некоторые старые модули) доступ к командной строке стал намного проще в использовании. А также для управления выводом и избежания некоторых ограничений традиционных методов.

System Commands In Python

Выполнение команд оболочки в Python

Теперь, когда мы узнали о системных командах в Python. Давайте посмотрим, как мы можем реализовать то же самое.

1. Использование метода os.system()

Как указывалось ранее, выполнение команд оболочки в Python можно легко выполнить с помощью некоторых методов модуля os . Здесь мы собираемся использовать широко используемый os.system() .

Эта функция реализована с использованием функции C system() и, следовательно, имеет те же ограничения.

Метод принимает системную команду как строку на входе и возвращает код вывода.

В приведенном ниже примере мы пытаемся проверить версию Python в нашей системе с помощью командной строки.

Здесь res сохраняет возвращенное значение (код выхода = 0 для успеха). Из выходных данных видно, что команда выполнена успешно, и мы получили нашу версию Python, как и ожидалось.

2. Использование модуля подпроцесса

Модуль subprocess поставляется с различными полезными методами или функциями для создания новых процессов, подключения к их каналам ввода / вывода / ошибок и получения их кодов возврата.

В этом руководстве мы рассматриваем методы call() и check_output() поскольку они просты в использовании и надежны. Но для получения дополнительной информации вы всегда можете обратиться к официальной документации.

2.1. Метод call()

Теперь перейдем к методу subprocess.call() .

Метод call() принимает аргументы командной строки, переданные в виде списка строк или с аргументом оболочки, установленным в True . И возвращает нам код выхода или статус.

В приведенном ниже фрагменте кода мы пытаемся установить pandas с помощью PIP из оболочки.

Как видим, команда выполнена успешно с zero возвращаемым значением.

2.2. Метод check_output()

Вышеупомянутые методы выполняют успешно переданную команду оболочки, но не дают пользователю свободы манипулировать способом получения вывода. Для этого на check_output() должен check_output() метод подпроцесса check_output() .

Метод выполняет переданную команду, но вместо возврата статуса выхода на этот раз возвращает bytes объект.

Присмотритесь к приведенному ниже примеру, где мы снова пытаемся установить модуль pymysql (уже установленный).

Здесь, как и в предыдущих случаях, res хранит объект, возвращаемый методом check_output() . Мы видим, что type(res) подтверждает, что объект имеет bytes тип.

После этого печатаем декодированную строку и видим, что команда успешно выполнена.

Вывод

Итак, сегодня мы узнали, как мы можем выполнять системные команды с помощью системной команды Python (os.system()) и модуля подпроцесса. Мы рассмотрели здесь еще несколько команд, связанных с Python, но стоит отметить, что методы этим не ограничиваются.

Мы рекомендуем попробовать другие команды, используя описанные выше методы, чтобы лучше понять.

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

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

В этом материале рассмотрим 7 способов запуска кода, написанного на Python. Они будут работать вне зависимости от операционной системы, среды Python или местоположения кода.

Где запускать Python-скрипты и как?

Python-код можно запустить одним из следующих способов:

  1. С помощью командной строки операционной системы (shell или терминал);
  2. С помощью конкретной версии Python или Anaconda;
  3. Использовать Crontab;
  4. Запустить код с помощью другого Python-скрипта;
  5. С помощью файлового менеджера;
  6. Использовать интерактивный режим Python;
  7. Использовать IDE или редактор кода.

Запуск Python-кода интерактивно

Для запуска интерактивной сессии нужно просто открыть терминал или командную строку и ввести python (или python3 в зависимости от версии). После нажатия Enter запустится интерактивный режим.

Вот как запустить интерактивный режим в разных ОС.

Интерактивный режим в Linux

Откройте терминал. Он должен выглядеть приблизительно вот так :

терминал Linux запуск python

После нажатия Enter будет запущен интерактивный режим Python.

Интерактивный режим в macOS

На устройствах с macOS все работает похожим образом. Изображение ниже демонстрирует интерактивный режим в этой ОС.

терминал MacOs запуск python

Интерактивный режим в Windows

В Windows нужно открыть командную строку и ввести python . После нажатия Enter появится приблизительно следующее:

терминал Windows запуск python

Запуск Python-скриптов в интерактивном режиме

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

Запуск Python-скриптов в интерактивном режиме

Этот код должен выводить целые числа от 0 до 5. В данном случае вывод — все, что появилось после print(i) .

Для выхода из интерактивного режима нужно написать следующее:

И нажать Enter. Вы вернетесь в терминал, из которого и начинали.

Есть и другие способы остановки работы с интерактивным режимом Python. В Linux нужно нажать Ctrl + D, а в Windows — Ctrl + Z + Enter.

Стоит отметить, что при использовании этого режима Python-скрипты не сохраняются в локальный файл.

Как выполняются Python-скрипты?

Отличный способ представить, что происходит при выполнении Python-скрипта, — использовать диаграмму ниже. Этот блок представляет собой скрипт (или функцию) Python, а каждый внутренний блок — строка кода.

При запуске скрипта интерпретатор Python проходит сверху вниз, выполняя каждую из них. Именно таким образом происходит выполнение кода.

Но и это еще не все.

Блок-схема выполнения кода интерпретатором

  • Шаг 1: скрипт или .py-файл компилируется, и из него генерируются бинарные данные. Готовый файл имеет расширение .pyc или .pyo.
  • Шаг 2: генерируется бинарный файл. Он читается интерпретатором для выполнения инструкций.

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

Иногда полезно изучать байткод. Если вы планируете стать опытным Python-программистом, то важно уметь понимать его для написания качественного кода.

Это также пригодится для принятия решений в процессе. Можно обратить внимание на отдельные факторы и понять, почему определенные функции/структуры данных работают быстрее остальных.

Как запускать Python-скрипты?

Для запуска Python-скрипта с помощью командной строки сначала нужно сохранить код в локальный файл.

Возьмем в качестве примера файл, который был сохранен как python_script.py. Сохранить его можно вот так:

Сохранить скрипт в текстовом редакторе достаточно легко. Процесс ничем не отличается от сохранения простого текстового файла.

Но если использовать командную строку, то здесь нужны дополнительные шаги. Во-первых, в самом терминале нужно перейти в директорию, где должен быть сохранен файл. Оказавшись в нужной папке, следует выполнить следующую команду (на linux):

После нажатия Enter откроется интерфейс командной строки, который выглядит приблизительно следующим образом:

интерфейс командной строки

Теперь можно писать код и с легкостью сохранять его прямо в командной строке.

Читайте также: