使用管道在两个匿名Python脚本间传递数据

2 投票
3 回答
5853 浏览
提问于 2025-04-15 12:33

想象一下在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的标准输入呢?

  1. PicklescriptA.py把字典写到标准输出,scriptB.py从标准输入读取这个字典。

  2. JSONscriptA.py把字典写到标准输出,scriptB.py从标准输入读取这个字典。

这两个方法在Python中都是内置的,代码量非常少。

在scriptA中,你可以用json.dump( {}, sys.stdout )或者pickle.dump( {}, sys.stdout )

在scriptB中,你可以用json.load( sys.stdin )或者pickle.load( sys.stdin )

撰写回答