блокировка sys.stdin при чтении пиккеля - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь передать объект python через stdio между двумя сценариями. Я бы хотел, чтобы объекты передавались одновременно. Мой подход заключается в вызове 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.]

По какой-то причине цикл for в 2.py блокируется. Я использовал шаблон

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

раньше и работает одновременно.

Почему он блокируется здесь, а не в других целях? Есть ли хороший (simpel) способ передачи пустых объектов между скриптами Python?

...