Как уже упоминалось, вы хотите использовать для этого модуль Python subprocess
.
Если вы действительно хотите что-то более сжатое, вы можете создать такую функцию:
#!/usr/bin/env python
import subprocess, shlex
def captcmd(cmd):
proc = subprocess.Popen(shlex.split(cmd), \
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
out, err = proc.communicate()
ret = proc.returncode
return (ret, out, err)
... тогда вы можете назвать это как:
ok, o, e = captcmd('ls -al /foo /bar ...')
print o
if not ok:
print >> sys.stderr, "There was an error (%d):\n" % ok
print >> sys.stderr, e
... или что угодно.
Примечание: я использую shlex.split()
в качестве гораздо более безопасной альтернативы shell=True
Естественно, вы могли бы написать это на свой вкус. Конечно, для каждого вызова вы должны либо указать три имени, в которые он может распаковать кортеж результата, либо вы должны извлечь желаемый вывод из результата, используя обычное индексирование (например, captcmd(...)[1]
для вывода). Естественно, вы можете написать вариант этой функции, чтобы объединить stdout и stderr и отбросить код результата. Эти "особенности" сделают его более похожим на выражения обратной связи Perl. (Сделайте это и возьмите вызов shlex.split()
, и у вас будет что-то такое же грубое и небезопасное, как и то, что делает Perl на самом деле).