我正在尝试在两个脚本之间的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对象?