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

sha*_*kin 1 python windows pipe

在Windows命令行考虑这个.

scriptA.py | scriptB.py
Run Code Online (Sandbox Code Playgroud)

我想通过pickle将scriptA.py中的字典对象发送到scriptB.py:将它发送到管道上.但我不知道如何做到这一点.

我在这里读过一些关于这个主题的帖子,但通常会有这样的答案:

Popen( "scriptA.py"´, ..., and so on )
Run Code Online (Sandbox Code Playgroud)

但我实际上并不知道"scriptA.py"的名称.我只想抓住ready管道对象并发送/接收数据缓冲区.

我已经尝试过sys.stdout/stdout,但是我得到了文件描述符错误,并且基本上没有尝试过那个轨道.

过程很简单:

scriptA.py:

  • (1)Pickle/Serialize字典到stringbuffer
  • (2)通过管道发送stringbuffer

scriptB.py

  • (3)从管道接收stringbuffer
  • (4)将stringbuffer取消/反序列化为字典

S.L*_*ott 7

当你对shell说这个

scriptA.py | scriptB.py
Run Code Online (Sandbox Code Playgroud)

shell将它们与管道连接起来.你没有任何东西,它完美无缺.

一切都scriptA.py写入sys.stdout来进入scriptB.py

scriptB.py从sys.stdin读取的所有内容都来自scriptA.py

他们已经联系了.

那么,如何将字典从A中的stdout传递到B中的stdin?

  1. 泡菜. scriptA.py将字典转储到stdout. scriptB.py从stdin加载字典.

  2. JSON. scriptA.py将字典转储到stdout. scriptB.py从stdin加载字典.

这已经内置到Python中并且需要非常非常少的代码.

在scriptA中,json.dump( {}, sys.stdout )pickle.dump( {}, sys.stdout )

在scriptB中,json.load( sys.stdin )pickle.load( sys.stdin )

  • 如果他在Windows上并且Python被"文件关联"(a.py | b.py)调用,而不是直接引用Python可执行文件(python a.py | python by)或例如(\ python26\python a.py) |\python26\python) - 就像他说的那样,你会得到关于"无效文件描述符"的黑暗嘀咕声; 它是Windows cmd.exe中长期存在的错误.另外,另一位提问者仅在几分钟前提出了这个问题. (2认同)