sharkin
sharkin

Reputation: 12498

Using pipes to communicate data between two anonymous python scripts

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:

scriptB.py

Upvotes: 2

Views: 6175

Answers (3)

miknight
miknight

Reputation: 493

When you are piping something, you are (generally) feeding the standard output of one program into the standard input of another. I think you should keep trying this path.

If you're having trouble just being able to read the output of your first script with your second, check out this question.

Upvotes: 0

stefanw
stefanw

Reputation: 10570

The pipe just puts stdout of A to stdin of B.

A does:

import sys
sys.stdout.writelines(output)

B just does:

import sys
input = sys.stdin.readlines()

Upvotes: 2

S.Lott
S.Lott

Reputation: 392012

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?

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

  2. 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 )

Upvotes: 8

Related Questions