Вызов внешней команды в Python
Как вы вызываете внешнюю команду (как будто я набрал ее в оболочке Unix или командной строке Windows) из скрипта Python?
Ответы
Ответ 1
Посмотрите на модуль подпроцесса в стандартной библиотеке:
import subprocess
subprocess.run(["ls", "-l"])
Преимущество subprocess
перед system
состоит в том, что он более гибкий (вы можете получить stdout
, stderr
, "настоящий" код состояния, лучшую обработку ошибок и т.д.).
Официальная документация рекомендует модуль subprocess
вместо альтернативного os.system()
:
Модуль subprocess
предоставляет более мощные средства для запуска новых процессов и получения их результатов; использование этого модуля предпочтительнее, чем использование этой функции [os.system()
].
Замена старых функций разделом "Модуль подпроцесса" в документации subprocess
может иметь несколько полезных рецептов.
Для версий Python до 3.5 используйте call
:
import subprocess
subprocess.call(["ls", "-l"])
Ответ 2
Вот краткое описание способов вызова внешних программ, преимуществ и недостатков каждой из них:
os.system("some_command with args")
передает команду и аргументы вашей системной оболочке. Это хорошо, потому что вы можете таким образом запускать несколько команд одновременно и настраивать каналы и перенаправление ввода/вывода. Например:
os.system("some_command < input_file | another_command > output_file")
Однако, хотя это удобно, вы должны вручную обрабатывать экранирование символов оболочки, таких как пробелы и т.д. С другой стороны, это также позволяет запускать команды, которые являются просто командами оболочки, а не внешними программами. Смотрите документацию.
stream = os.popen("some_command with args")
будет делать то же самое, что и os.system
, за исключением того, что он дает вам файлоподобный объект, который вы можете использовать для доступа к стандартному вводу/выводу для этого процесса. Есть 3 других варианта popen, которые все обрабатывают ввод/вывод немного по-другому. Если вы передаете все как строку, то ваша команда передается в оболочку; если вы передаете их в виде списка, вам не нужно беспокоиться о том, чтобы избежать чего-либо. Смотрите документацию.
Класс Popen
модуля subprocess
. Это задумано как замена для os.popen
, но имеет недостаток в том, чтобы быть немного более сложным из-за того, что он настолько всеобъемлющий. Например, вы бы сказали:
print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()
вместо:
print os.popen("echo Hello World").read()
но приятно иметь все опции в одном унифицированном классе вместо 4 разных функций popen. Смотрите документацию.
Функция call
из модуля subprocess
. В основном это похоже на класс Popen
и принимает все те же аргументы, но он просто ждет завершения команды и выдает код возврата. Например:
return_code = subprocess.call("echo Hello World", shell=True)
Смотрите документацию.
Если вы используете Python 3.5 или более позднюю версию, вы можете использовать новую функцию subprocess.run
, которая очень похожа на описанную выше, но еще более гибкая и возвращает объект CompletedProcess
когда команда завершит выполнение.
Модуль os также имеет все функции fork/exec/spawn, которые есть в программе на C, но я не рекомендую использовать их напрямую.
Модуль subprocess
, вероятно, должен быть тем, что вы используете.
Наконец, имейте в виду, что для всех методов, в которых вы передаете последнюю команду для выполнения оболочкой в виде строки, вы несете ответственность за ее исключение. Существуют серьезные последствия для безопасности, если какой-либо части передаваемой вами строки нельзя полностью доверять. Например, если пользователь вводит некоторую/любую часть строки. Если вы не уверены, используйте эти методы только с константами. Чтобы дать вам подсказку о последствиях, рассмотрите этот код:
print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()
и представьте, что пользователь вводит что-то "моя мама не любила меня & rm -rf/", что может стереть всю файловую систему.
Ответ 3
Типичная реализация:
import subprocess
p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
print line,
retval = p.wait()
Вы можете делать все, что хотите, с данными stdout
в канале. Фактически, вы можете просто пропустить эти параметры (stdout=
и stderr=
), и он будет вести себя как os.system()
.
Ответ 4
Некоторые подсказки по отсоединению дочернего процесса от вызывающего (запуск дочернего процесса в фоновом режиме).
Предположим, вы хотите запустить длинную задачу из CGI- script, то есть дочерний процесс должен жить дольше, чем процесс выполнения CGI- script.
Классический пример из документов модуля подпроцесса:
import subprocess
import sys
# some code here
pid = subprocess.Popen([sys.executable, "longtask.py"]) # call subprocess
# some more code here
Идея здесь заключается в том, что вы не хотите ждать в подпроцессе "call sub" до тех пор, пока longtask.py не будет завершен. Но неясно, что происходит после строки "еще один код здесь" из примера.
Моя целевая платформа была бесплатной, но разработка была в Windows, поэтому я сначала столкнулся с проблемой в Windows.
В окнах (win xp) родительский процесс не завершится, пока longtask.py не завершит свою работу. Это не то, что вы хотите в CGI- script. Проблема не специфична для Python, в сообществе PHP проблемы одинаковы.
Решение состоит в том, чтобы передать DETACHED_PROCESS флаг создания процесса в базовую функцию CreateProcess в win API.
Если вы установили pywin32, вы можете импортировать флаг из модуля win32process, иначе вы должны определить его самостоятельно:
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen([sys.executable, "longtask.py"],
creationflags=DETACHED_PROCESS).pid
/* UPD 2015.10.27 @eryksun в комментарии ниже отмечает, что семантически правильный флаг: CREATE_NEW_CONSOLE (0x00000010) */
В freebsd возникает другая проблема: когда родительский процесс завершен, он также завершает дочерние процессы. И это не то, что вы хотите в CGI- script. Некоторые эксперименты показали, что проблема, по-видимому, заключается в совместном использовании sys.stdout. И рабочим решением было следующее:
pid = subprocess.Popen([sys.executable, "longtask.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
Я не проверял код на других платформах и не знаю причин поведения на freebsd. Если кто-нибудь знает, пожалуйста, поделитесь своими идеями. Googling при запуске фоновых процессов в Python еще не проливает свет.
Ответ 5
Я бы рекомендовал использовать модуль подпроцесса вместо os.system, потому что он для вас отключается, и поэтому гораздо безопаснее: http://docs.python.org/library/subprocess.html
subprocess.call(['ping', 'localhost'])
Ответ 6
import os
cmd = 'ls -al'
os.system(cmd)
Если вы хотите вернуть результаты команды, вы можете использовать os.popen
. Тем не менее, это устарело со версии 2.6 в пользу модуля подпроцесса, который другие ответы хорошо рассмотрели.
Ответ 7
import os
os.system("your command")
Обратите внимание, что это опасно, так как команда не очищается. Я оставляю это для вас в google для соответствующей документации по модулям "os" и "sys". Есть куча функций (exec * и spawn *), которые будут делать подобные вещи.
Ответ 8
Существует множество разных библиотек, которые позволяют вам вызывать внешние команды с помощью Python. Для каждой библиотеки я дал описание и показал пример вызова внешней команды. В качестве примера я использовал команду ls -l
(список всех файлов). Если вы хотите узнать больше о любой из библиотек, которые я перечислил, и связать документацию для каждого из них.
Источники:
Это все библиотеки:
Надеюсь, это поможет вам принять решение о том, какую библиотеку использовать:)
подпроцесс
Подпроцесс позволяет вам вызывать внешние команды и подключать их к их каналам ввода/вывода/ошибок (stdin, stdout и stderr). Subprocess - это выбор по умолчанию для запуска команд, но иногда другие модули лучше.
subprocess.run(["ls", "-l"]) # Run command
subprocess.run(["ls", "-l"], stdout=subprocess.PIPE) # This will run the command and return any output
subprocess.run(shlex.split("ls -l")) # You can also use the shlex library to split the command
ОС
os используется для "функциональности, зависящей от операционной системы". Его также можно использовать для вызова внешних команд с помощью os.system
и os.popen
(Примечание: существует также подпроцесс .popen). os всегда будет запускать оболочку и является простой альтернативой для людей, которым это не нужно, или не знает, как использовать subprocess.run
.
os.system("ls -l") # run command
os.popen("ls -l").read() # This will run the command and return any output
ш
sh - это интерфейс подпроцесса, который позволяет вам вызывать программы, как если бы они были функциями. Это полезно, если вы хотите запустить команду несколько раз.
sh.ls("-l") # Run command normally
ls_cmd = sh.Command("ls") # Save command as a variable
ls_cmd() # Run command as if it were a function
Свинец
plumbum - это библиотека для "script -подобных" программ Python. Вы можете вызывать программы, подобные функциям, как в sh
. Plumbum полезен, если вы хотите запустить конвейер без оболочки.
ls_cmd = plumbum.local("ls -l") # get command
ls_cmd() # run command
pexpect
pexpect позволяет вам создавать дочерние приложения, управлять ими и находить шаблоны в своем выпуске. Это лучшая альтернатива подпроцессу для команд, ожидающих tty в Unix.
pexpect.run("ls -l") # Run command as normal
child = pexpect.spawn('scp foo [email protected]:.') # Spawns child application
child.expect('Password:') # When this is the output
child.sendline('mypassword')
ткань
fabric - это библиотека Python 2.5 и 2.7. Он позволяет выполнять локальные и удаленные команды оболочки. Ткань является простой альтернативой для запуска команд в защищенной оболочке (SSH)
fabric.operations.local('ls -l') # Run command as normal
fabric.operations.local('ls -l', capture = True) # Run command and receive output
посланник
envoy известен как "подпроцесс для людей". Он используется как удобная обложка вокруг модуля subprocess
.
r = envoy.run("ls -l") # Run command
r.std_out # get output
Команды
commands
содержит функции-обертки для os.popen
, но он был удален из Python 3, поскольку subprocess
является лучшей альтернативой.
Редактирование было основано на комментарии Дж. Ф. Себастьяна.
Ответ 9
Я всегда использую fabric
для таких вещей, как:
from fabric.operations import local
result = local('ls', capture=True)
print "Content:/n%s" % (result, )
Но это кажется хорошим инструментом: sh
(интерфейс подпроцесса Python).
Посмотрите пример:
from sh import vgdisplay
print vgdisplay()
print vgdisplay('-v')
print vgdisplay(v=True)
Ответ 10
Также проверьте библиотеку Python "pexpect".
Он позволяет осуществлять интерактивное управление внешними программами/командами, даже ssh, ftp, telnet и т.д. Вы можете просто набрать что-то вроде:
child = pexpect.spawn('ftp 192.168.0.24')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
Ответ 11
Если вам нужен вывод из команды, которую вы вызываете, вы можете использовать subprocess.check_output (Python 2. 7+).
>>> subprocess.check_output(["ls", "-l", "/dev/null"])
'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
Также обратите внимание на параметр оболочки.
Если shell имеет значение True
, указанная команда будет выполнена через оболочку. Это может быть полезно, если вы используете Python в первую очередь для расширенного потока управления, который он предлагает для большинства системных оболочек, и по-прежнему хотят иметь удобный доступ к другим функциям оболочки, таким как оболочки, подстановочные знаки файлов, расширение переменных окружения и расширение ~ для пользователей каталог. Однако обратите внимание, что сам Python предлагает реализации многих оболочечных функций (в частности, glob
, fnmatch
, os.walk()
, os.path.expandvars()
, os.path.expanduser()
и shutil
).
Ответ 12
Со стандартной библиотекой
Модуль подпроцесса использования (Python 3):
import subprocess
subprocess.run(['ls', '-l'])
Это рекомендуемый стандартный способ. Однако более сложные задачи (трубы, выходные данные, ввод и т.д.) Могут быть утомительными для создания и записи.
Примечание по версии Python: если вы все еще используете Python 2, subprocess.call работает аналогичным образом.
ProTip: shlex.split может помочь вам разобрать команду для run
, call
и других функций subprocess
в случае, если вы не хотите (или не можете!) Предоставить их в виде списков:
import shlex
import subprocess
subprocess.run(shlex.split('ls -l'))
С внешними зависимостями
Если вы не возражаете против внешних зависимостей, используйте plumbum:
from plumbum.cmd import ifconfig
print(ifconfig['wlan0']())
Это лучшая оболочка subprocess
. Это кросс-платформенный, то есть он работает как в Windows, так и в Unix-подобных системах. Устанавливать на pip install plumbum
.
Другая популярная библиотека - sh:
from sh import ifconfig
print(ifconfig('wlan0'))
Тем не менее sh
отказался от поддержки Windows, поэтому он не такой потрясающий, как раньше. Устанавливать по pip install sh
.
Ответ 13
Вот как я запускаю свои команды. Этот код содержит все, что вам нужно.
from subprocess import Popen, PIPE
cmd = "ls -l ~/"
p = Popen(cmd , shell=True, stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
print "Return code: ", p.returncode
print out.rstrip(), err.rstrip()
Ответ 14
Update:
subprocess.run
- рекомендуемый подход от Python 3.5, если вашему коду не требуется поддерживать совместимость с более ранними версиями Python. Это более последовательное и предлагает аналогичную легкость использования в качестве посланника. (Трубопровод не так прост, но смотрите этот вопрос, как.)
Вот несколько примеров из документов.
Запустите процесс:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
Поднять неудачный прогон:
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
Захват вывода:
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
Оригинальный ответ:
Я рекомендую попробовать Envoy. Это оболочка для подпроцесса, которая, в свою очередь, старается заменить более старые модули и функции. Посланник является подпроцессом для людей.
Пример использования readme:
>>> r = envoy.run('git config', data='data to pipe in', timeout=2)
>>> r.status_code
129
>>> r.std_out
'usage: git config [options]'
>>> r.std_err
''
Сопротивление труб:
>>> r = envoy.run('uptime | pbcopy')
>>> r.command
'pbcopy'
>>> r.status_code
0
>>> r.history
[<Response 'uptime'>]
Ответ 15
Без вывода результата:
import os
os.system("your command here")
С выходом результата:
import commands
commands.getoutput("your command here")
or
commands.getstatusoutput("your command here")
Ответ 16
https://docs.python.org/2/library/subprocess.html
... или для очень простой команды:
import os
os.system('cat testfile')
Ответ 17
Существует также Plumbum
>>> from plumbum import local
>>> ls = local["ls"]
>>> ls
LocalCommand(<LocalPath /bin/ls>)
>>> ls()
u'build.py\ndist\ndocs\nLICENSE\nplumbum\nREADME.rst\nsetup.py\ntests\ntodo.txt\n'
>>> notepad = local["c:\\windows\\notepad.exe"]
>>> notepad() # Notepad window pops up
u'' # Notepad window is closed by user, command returns
Ответ 18
os.system
ОК, но вроде датировано. Это также не очень безопасно. Вместо этого попробуйте subprocess
. subprocess
не вызывает sh напрямую и поэтому более безопасен, чем os.system
.
Получить дополнительную информацию здесь.
Ответ 19
Вызов внешней команды в Python
Простой, используйте subprocess.run
, который возвращает объект CompletedProcess
:
>>> import subprocess
>>> completed_process = subprocess.run('python --version')
Python 3.6.1 :: Anaconda 4.4.0 (64-bit)
>>> completed_process
CompletedProcess(args='python --version', returncode=0)
Почему?
Как и в Python 3.5, в документации рекомендуется subprocess.run:
Рекомендуемым подходом к вызову подпроцессов является использование функции run() для всех случаев использования, которые она может обрабатывать. Для более продвинутых случаев использования интерфейс Popen можно использовать напрямую.
Вот пример простейшего возможного использования - и он точно так же спрашивает:
>>> import subprocess
>>> completed_process = subprocess.run('python --version')
Python 3.6.1 :: Anaconda 4.4.0 (64-bit)
>>> completed_process
CompletedProcess(args='python --version', returncode=0)
run
ждет завершения команды, а затем возвращает объект CompletedProcess
. Он может вместо этого поднимать TimeoutExpired
(если вы даете ему аргумент timeout=
) или CalledProcessError
(если он терпит неудачу и вы проходите check=True
).
Как вы могли бы сделать вывод из приведенного выше примера, stdout и stderr оба по умолчанию передаются на ваш собственный stdout и stderr.
Мы можем проверить возвращаемый объект и увидеть команду, которая была указана, и код возврата:
>>> completed_process.args
'python --version'
>>> completed_process.returncode
0
Захват вывода
Если вы хотите захватить вывод, вы можете передать subprocess.PIPE
в соответствующие stderr
или stdout
:
>>> cp = subprocess.run('python --version',
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
>>> cp.stderr
b'Python 3.6.1 :: Anaconda 4.4.0 (64-bit)\r\n'
>>> cp.stdout
b''
(Я нахожу это интересным и слегка противоречивым, что информация о версии попадает в stderr вместо stdout.)
Передайте список команд
Можно легко перейти от ручного предоставления командной строки (например, вопрос) к созданию строки, построенной программно. Не программировать строки программно. Это потенциальная проблема безопасности. Лучше предположить, что вы не доверяете входным данным.
>>> import textwrap
>>> args = ['python', textwrap.__file__]
>>> cp = subprocess.run(args, stdout=subprocess.PIPE)
>>> cp.stdout
b'Hello there.\r\n This is indented.\r\n'
Обратите внимание, что только args
следует передавать позиционно.
Полная подпись
Здесь действительная подпись в источнике и как показано help(run)
:
def run(*popenargs, input=None, timeout=None, check=False, **kwargs):
popenargs
и kwargs
присваиваются конструктору Popen
. input
может быть строкой байтов (или unicode, если указать кодировку или universal_newlines=True
), которые будут переданы в подпроцесс stdin.
Документация описывает timeout=
и check=True
лучше, чем я мог:
Аргумент timeout передается в Popen.communicate(). Если тайм-аут истекает, дочерний процесс будет убит и ждет. Исключение TimeoutExpired будет повторно поднято после того, как дочерний процесс будет прекращается.
Если проверка верна, и процесс завершается с ненулевым кодом выхода, Вызов CalledProcessError будет повышен. Атрибуты этого исключение содержат аргументы, код выхода и stdout и stderr, если они были захвачены.
и этот пример для check=True
лучше, чем один, который я мог бы придумать:
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
Расширенная подпись
Здесь расширенная подпись, указанная в документации:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None,
shell=False, cwd=None, timeout=None, check=False, encoding=None,
errors=None)
Обратите внимание, что это означает, что только список аргументов должен быть передан позиционно. Итак, передайте оставшиеся аргументы в качестве аргументов ключевого слова.
Popen
При использовании Popen
вместо этого? Я бы изо всех сил пытался найти прецедент, основанный только на аргументах. Однако прямое использование Popen
даст вам доступ к его методам, включая poll
, 'send_signal', 'terminate' и 'wait'.
Здесь подпись Popen
, указанная в источнике. Я думаю, что это наиболее точное инкапсулирование информации (в отличие от help(Popen)
):
def __init__(self, args, bufsize=-1, executable=None,
stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0,
restore_signals=True, start_new_session=False,
pass_fds=(), *, encoding=None, errors=None):
Но более информативным является документация Popen
:
subprocess.Popen(args, bufsize=-1, executable=None, stdin=None,
stdout=None, stderr=None, preexec_fn=None, close_fds=True,
shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0, restore_signals=True,
start_new_session=False, pass_fds=(), *, encoding=None, errors=None)
Выполните дочернюю программу в новом процессе. В POSIX класс использует os.execvp() - подобное поведение для выполнения дочерней программы. В Windows, класс использует функцию Windows CreateProcess(). Аргументы в Popen:
Понимание оставшейся документации на Popen
будет оставлено как упражнение для читателя.
Ответ 20
Использование:
import os
cmd = 'ls -al'
os.system(cmd)
os - этот модуль предоставляет переносимый способ использования функциональных возможностей, зависящих от операционной системы.
Для более os
функций здесь является документация.
Ответ 21
Это может быть так просто:
import os
cmd = "your command"
os.system(cmd)
Ответ 22
использовать модуль os
import os
os.system("your command")
например
import os
os.system("ifconfig")
Ответ 23
Здесь есть еще одна разница, которая не упоминается ранее.
subprocess.Popen
выполняет <command> как подпроцесс. В моем случае мне нужно выполнить файл <a>, который должен связываться с другой программой, <b>.
Я попробовал подпроцесс, и выполнение было успешным. Однако <b> не удалось связаться с <a>. Все нормально, когда я запускаю оба терминала.
Еще одно: (ПРИМЕЧАНИЕ: kwrite ведет себя отличным от других приложений. Если вы попробуете приведенный ниже с Firefox, результаты будут не такими.)
Если вы попробуете os.system("kwrite")
, программный поток зависает, пока пользователь не закроет kwrite. Чтобы преодолеть это, я попробовал вместо os.system(konsole -e kwrite)
. Эта программа продолжилась, но kwrite стал подпроцессом консоли.
Кто-нибудь запускает kwrite, не являющийся подпроцессом (т.е. в системном мониторе он должен появляться на крайнем левом краю дерева).
Ответ 24
subprocess.check_call
удобно, если вы не хотите проверять возвращаемые значения. Он генерирует исключение при любой ошибке.
Ответ 25
Мне очень нравится 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
Ответ 26
Я обычно использую subprocess вместе с 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)
Ответ 27
os.system
не позволяет сохранять результаты, поэтому, если вы хотите сохранить результаты в каком-то списке или что-то subprocess.call
работает.
Ответ 28
Бесстыдный плагин, я написал для этого библиотеку: P
https://github.com/houqp/shell.py
В настоящее время это оболочка для popen и shlex. Он также поддерживает команды конвейеров, чтобы упростить цепочку команд в Python. Таким образом, вы можете делать такие вещи, как:
ex('echo hello shell.py') | "awk '{print $2}'"
Ответ 29
Вы можете использовать Popen, а затем вы можете проверить статус процедуры:
from subprocess import Popen
proc = Popen(['ls', '-l'])
if proc.poll() is None:
proc.kill()
Проверьте подпроцесс.
Ответ 30
В 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