读取pickel时sys.stdin阻塞

时间:2019-05-09 17:49:31

标签: python sys

我正在尝试在两个脚本之间的stdio上传递python对象。 我想对并行传递的对象进行处理。 我的方法是调用print str(pickle.dumps(object))并从另一端的sys.stdout中读取 在另一端使用pickle.loads(eval(string))。 但是,第二个脚本会阻塞,直到它在继续操作之前已读取所有stdin为止。

我正在尝试编写可以通过管道灵活地组合在一起的简单python脚本。 我有一个生成模拟(PIMC)的脚本。 在模拟的每个步骤中,我都希望将当前路径打印到要进行处理的其他笔迹上。 我已经有一个管道系统可以使用matplotlib进行绘图。

我有2个程序,称为togethr,它具有类似这样的管道

$ 1.py | 2.py

1.py

#!/bin/env python
import sys
import pickle
import numpy as np
import time

for i in range(5):
    x = i*np.ones(10)
    print(str(pickle.dumps(x)))
    time.sleep(0.5)
    print(f'{i}',file=sys.stderr)

2.py

#!/bin/env python
import sys
import pickle
import numpy as np

for line in sys.stdin:
    data = pickle.loads((eval(line.replace('\n',''))))
    print(data)

预期输出:

0
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
1
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
2
[2. 2. 2. 2. 2. 2. 2. 2. 2. 2.]
3
[3. 3. 3. 3. 3. 3. 3. 3. 3. 3.]
4
[4. 4. 4. 4. 4. 4. 4. 4. 4. 4.]

实际输出

0
1
2
3
4
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[2. 2. 2. 2. 2. 2. 2. 2. 2. 2.]
[3. 3. 3. 3. 3. 3. 3. 3. 3. 3.]
[4. 4. 4. 4. 4. 4. 4. 4. 4. 4.]

2.py中的for循环由于某种原因而阻塞。 我已经使用了

for line in sys.stdin:
    line = line.replace('\n','')

之前,它可以同时运行。

为什么它在这里阻塞而不在其他用途​​中阻塞? 有没有一种很好的(简单的方法)在python脚本之间传递numpy对象?

0 个答案:

没有答案