Я пытаюсь передать объект 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?