Модуль sh
может перенаправить STDOUT
и STDERR
процесса на множество различных типов целей, используя специальные ключевые аргументы _out
и _err
.
Если в качестве значения ключевых аргументов _out
и _err
используется строка, то предполагается, что это имя файла. Имя файла открывается как mode='wb'
, что означает создание файла в двоичном режиме.
import sh sh.ifconfig(_out="/tmp/interfaces")
В качестве значений _out
и _err
можно также использовать любой объект, который поддерживает метод .write(data)
, например io.StringIO
или файловый объект:
import sh from io import StringIO buf = StringIO() sh.ifconfig(_out=buf) print(buf.getvalue())
А как добавлять выходные данные в существующий файл?
Для этого необходимо использовать файловый объект, открытый в желаемом режиме, например mode='a'
:
import sh fp = open("/tmp/output", "a") sh.ls("/dir1", _out=fp) sh.ls("/dir2", _out=fp)
Функция обратного вызова также может быть использована в качестве цели. Функция должна соответствовать одной из трех сигнатур:
fn(data)
: функция берет только часть данных из процесса.fn(data, stdin_queue)
в дополнение к предыдущей сигнатуре функция также принимает очередь queue.Queue
, которая может использоваться для программного взаимодействия с процессом.fn(data, stdin_queue, process)
в дополнение к предыдущей сигнатуре функция принимает weakref.weakref
from sh import tail # функция обратного вызова def process_output(line): print(line) p = tail("-f", "/var/log/some_log_file.log", _out=process_output, _bg=True) p.wait()