Как отличить файл и выводить поток «на лету»? - PullRequest
26 голосов
/ 07 января 2010

Мне нужно создать файл diff с помощью стандартной команды UNIX diff с модулем python subprocess Проблема в том, что я должен сравнивать файл и поток без создания временного файла. Я думал об использовании именованных каналов с помощью метода os.mkfifo , но не достиг хорошего результата. Пожалуйста, не могли бы вы написать простой пример, как решить эту проблему? Я пытался так:

fifo = 'pipe'
os.mkfifo(fifo)
op = popen('cat ', fifo)
print >> open(fifo, 'w'), output
os.unlink(fifo)
proc = Popen(['diff', '-u', dumpfile], stdin=op, stdout=PIPE)

но похоже, что diff не видит второй аргумент.

Ответы [ 2 ]

36 голосов
/ 07 января 2010

Вы можете использовать "-" в качестве аргумента, чтобы diff означало stdin.

8 голосов
/ 07 января 2010

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

В качестве альтернативы, вы можете создать конвейер оболочки и использовать подстановку процессов, например, так:

diff <(cat pipe) dumpfile # You compare the output of a process and a physical file without explicitly using a temporary file.

Для получения подробной информации, проверьте http://tldp.org/LDP/abs/html/process-sub.html

...