读取pi时sys.stdin阻塞

2024-04-20 05:56:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在两个脚本之间通过stdio传递python对象。 我想对同时传递的对象进行处理。 我的方法是调用print str(pickle.dumps(object))并从另一端的sys.stdout读取 在另一端使用pickle.load(eval(string))。 但是,第二个脚本会一直阻塞,直到它在继续之前读取了所有的stdin

我正在尝试编写简单的python脚本,这些脚本可以通过flexabley管道连接在一起。 我有一个生成模拟的脚本(PIMC)。 在模拟过程中的每一步,我都想将当前路径打印到另一个作者的scrips上,以便进行处理。 我已经有了一个管道系统,允许使用matplotlib绘制plott

我有两个程序,叫做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','')

之前,它将同时运行

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


Tags: 对象方法inpyimportnumpy脚本for