Using pipes to communicate data between two anonymous python scripts

pipe, python, windows

Solution

When you say this to a shell

scriptA.py | scriptB.py

The shell connects them with a pipe. You do NOTHING and it works perfectly.

Everything that `scriptA.py` writes to sys.stdout goes to `scriptB.py`

Everything that `scriptB.py` reads from sys.stdin came from `scriptA.py`

They're already connected.

So, how do you pass a dictionary from stdout in A to stdin in B?

Pickle. `scriptA.py` dumps the dictionary to stdout. `scriptB.py` loads the dictionary from stdin.

JSON. `scriptA.py` dumps the dictionary to stdout. `scriptB.py` loads the dictionary from stdin.

This is already built-in to Python and takes very, very little code.

In scriptA, `json.dump( {}, sys.stdout )` or `pickle.dump( {}, sys.stdout )`

In scriptB, `json.load( sys.stdin )` or `pickle.load( sys.stdin )`

Problem

Consider this at the windows commandline. ``` scriptA.py | scriptB.py ``` I want to send a dictionary object from scriptA.py to scriptB.py by pickle:ing it and sending it over a pipe. But I don't know how to accomplish this. I've read some posts about this subject here, but usually there's answers along these line: ``` Popen( "scriptA.py"´, ..., and so on ) ``` But I don't actually know the name of "scriptA.py". I just want to get hold of the ready pipe object and send/receive the databuffer. I've tried sys.stdout/stdout, but I get file-descriptor errors and basically haven't tried that track very far. The process is simple: scriptA.py: - (1) Pickle/Serialize dictionary into stringbuffer - (2) Send stringbuffer over pipe scriptB.py - (3) Receive stringbuffer from pipe - (4) Unpickle/Deserialize stringbuffer into dictionary

Original source