使用管道在两个匿名Python脚本间传递数据
想象一下在Windows的命令行里。
scriptA.py | scriptB.py
我想把一个字典对象从scriptA.py传送到scriptB.py,方法是先把它用pickle处理,然后通过管道发送过去。但我不知道该怎么做。
我看过一些关于这个话题的帖子,但通常得到的回答都是这样的:
Popen( "scriptA.py"´, ..., and so on )
不过我其实不知道“scriptA.py”的名字。我只想拿到已经准备好的管道对象,然后发送和接收数据。
我试过用sys.stdout/stdout,但遇到了文件描述符错误,基本上没有在这条路上走得太远。
这个过程很简单:
scriptA.py:
- (1) 把字典用pickle处理成字符串缓冲区
- (2) 通过管道发送字符串缓冲区
scriptB.py
- (3) 从管道接收字符串缓冲区
- (4) 把字符串缓冲区用pickle处理回字典
3 个回答
0
当你在使用管道的时候,通常是把一个程序的标准输出(就是它显示的结果)送到另一个程序的标准输入(就是它需要的输入)。我觉得你应该继续尝试这个方法。
如果你在用第二个程序读取第一个程序的输出时遇到困难,可以看看 这个问题。
2
管道的作用就是把A程序的输出直接送到B程序的输入。
A程序做的事情是:
import sys
sys.stdout.writelines(output)
B程序做的事情是:
import sys
input = sys.stdin.readlines()
8
当你对一个命令行工具说这些话时
scriptA.py | scriptB.py
这个工具会用管道把它们连接起来。你什么都不用做,它就能完美运行。
所有scriptA.py
写到标准输出(sys.stdout)上的内容,都会传给scriptB.py
。
所有scriptB.py
从标准输入(sys.stdin)读取的内容,都是来自scriptA.py
。
它们已经连接好了。
那么,如何把一个字典从A的标准输出传到B的标准输入呢?
这两个方法在Python中都是内置的,代码量非常少。
在scriptA中,你可以用json.dump( {}, sys.stdout )
或者pickle.dump( {}, sys.stdout )
。
在scriptB中,你可以用json.load( sys.stdin )
或者pickle.load( sys.stdin )
。