How to diff file and output stream "on-the-fly"?

Question:

I need to create a diff file using standard UNIX diff command with python subprocess module. The problem is that I must compare file and stream without creating tempopary file. I thought about using named pipes via os.mkfifo method, but didn’t reach any good result. Please, can you write a simple example on how to solve this stuff? I tried like so:

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)

but it seems like diff doesn’t see the second argument.

Asked By: Enchantner

||

Answers:

You can use “-” as an argument to diff to mean stdin.

Answered By: Fred Larson

You could perhaps consider using the difflib python module (I’ve linked to an example here) and create something that generates and prints the diff directly rather than relying on diff. The various function methods inside difflib can receive character buffers which can be processed into diffs of various types.

Alternatively, you can construct a shell pipeline and use process substitution like so

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

For details, check out http://tldp.org/LDP/abs/html/process-sub.html

Answered By: Noufal Ibrahim
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.