Вызов внешней команды в Python - PullRequest
4261 голосов
/ 18 сентября 2008

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

Ответы [ 56 ]

25 голосов
/ 30 апреля 2018

Это может быть так просто:

import os
cmd = "your command"
os.system(cmd)
21 голосов
/ 27 июля 2018

использовать модуль os

import os
os.system("your command")

например

import os
os.system("ifconfig")
20 голосов
/ 18 января 2011

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

20 голосов
/ 30 апреля 2014

Я склонен использовать подпроцесс вместе с shlex (для обработки экранирования строк в кавычках):

>>> import subprocess, shlex
>>> command = 'ls -l "/your/path/with spaces/"'
>>> call_params = shlex.split(command)
>>> print call_params
["ls", "-l", "/your/path/with spaces/"]
>>> subprocess.call(call_params)
20 голосов
/ 09 января 2010

Здесь есть еще одно отличие, которое ранее не упоминалось.

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

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

Еще один: (ПРИМЕЧАНИЕ: kwrite ведет себя не так, как другие приложения. Если вы попробуете описанное ниже с Firefox, результаты будут не такими.)

Если вы попробуете os.system("kwrite"), поток программы остановится, пока пользователь не закроет kwrite. Чтобы преодолеть это, я попытался вместо этого os.system(konsole -e kwrite). На этот раз программа продолжала работать, но kwrite стал подпроцессом консоли.

Любой, кто запускает kwrite, не будучи подпроцессом (т. Е. В системном мониторе, он должен появляться у самого левого края дерева).

19 голосов
/ 13 августа 2012

Мне очень нравится shell_command за его простоту. Он построен поверх модуля подпроцесса.

Вот пример из документации:

>>> from shell_command import shell_call
>>> shell_call("ls *.py")
setup.py  shell_command.py  test_shell_command.py
0
>>> shell_call("ls -l *.py")
-rw-r--r-- 1 ncoghlan ncoghlan  391 2011-12-11 12:07 setup.py
-rw-r--r-- 1 ncoghlan ncoghlan 7855 2011-12-11 16:16 shell_command.py
-rwxr-xr-x 1 ncoghlan ncoghlan 8463 2011-12-11 16:17 test_shell_command.py
0
19 голосов
/ 12 июня 2012

os.system не позволяет вам сохранять результаты, поэтому, если вы хотите сохранить результаты в каком-то списке или что-то еще, subprocess.call работает.

16 голосов
/ 02 мая 2014

Бесстыдный плагин, я для этого написал библиотеку: P https://github.com/houqp/shell.py

На данный момент это в основном оболочка для popen и shlex. Он также поддерживает команды конвейеризации, так что вы можете упростить цепочку команд в Python. Таким образом, вы можете делать такие вещи, как:

ex('echo hello shell.py') | "awk '{print $2}'"
15 голосов
/ 27 ноября 2016

В Linux, если вы хотите вызвать внешнюю команду, которая будет выполняться независимо (будет продолжать работать после завершения сценария python), вы можете использовать простую очередь в качестве диспетчера задач или при команда

Пример с диспетчером очереди задач:

import os
os.system('ts <your-command>')

Примечания о диспетчере очереди задач (ts):

  1. Вы можете установить количество одновременных процессов («слотов») для запуска с помощью:

    ts -S <number-of-slots>

  2. Установка ts не требует прав администратора. Вы можете скачать и скомпилировать его из исходного кода с помощью простого make, добавить его на свой путь, и все готово.

14 голосов
/ 17 июня 2016

В Windows вы можете просто импортировать модуль subprocess и запускать внешние команды, вызывая subprocess.Popen(), subprocess.Popen().communicate() и subprocess.Popen().wait(), как показано ниже:

# Python script to run a command line
import subprocess

def execute(cmd):
    """
        Purpose  : To execute a command and return exit status
        Argument : cmd - command to execute
        Return   : exit_code
    """
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (result, error) = process.communicate()

    rc = process.wait()

    if rc != 0:
        print "Error: failed to execute command:", cmd
        print error
    return result
# def

command = "tasklist | grep python"
print "This process detail: \n", execute(command)

Выход:

This process detail:
python.exe                     604 RDP-Tcp#0                  4      5,660 K
...