views:

180

answers:

2

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.

+1  A: 

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

Fred Larson
Then, you can pass `stdin=PIPE` to the `Popen` call, and then `proc.stdin.write(data)`.
LeafStorm
+1  A: 

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

Noufal Ibrahim