Использование каналов для передачи данных между двумя анонимными скриптами Python

1

Рассмотрим это в командной строке Windows.

scriptA.py | scriptB.py

Я хочу отправить объект-словарь из scriptA.py в scriptB.py с помощью pickle: его и отправки его по каналу. Но я не знаю, как это сделать.

Я прочитал несколько сообщений об этом предмете здесь, но обычно там ответы по этой линии:

Popen( "scriptA.py"´, ..., and so on )

Но я действительно не знаю имя "scriptA.py". Я просто хочу завладеть готовым объектом трубы и отправить/получить databuffer.

Я пробовал sys.stdout/stdout, но я получаю ошибки файлового дескриптора и в основном не пробовал этот трек очень далеко.

Процесс прост:

scriptA.py:

  • (1) Словарь Pickle/Serialize в stringbuffer
  • (2) Отправить stringbuffer over pipe

scriptB.py

  • (3) Получить строковый буфер из трубы
  • (4) Unpickle/Deserialize stringbuffer в словарь
Теги:
pipe

3 ответа

7
Лучший ответ

Если вы скажете это оболочке

scriptA.py | scriptB.py

Оболочка соединяет их с трубой. Вы НИЧЕГО, и он отлично работает.

Все, что scriptA.py записывает в sys.stdout, идет в scriptB.py

Все, что scriptB.py читает из sys.stdin, произошло от scriptA.py

Они уже подключены.

Итак, как вы передаете словарь из stdout в в stdin в B?

  • Pickle. scriptA.py сбрасывает словарь в stdout. scriptB.py загружает словарь из stdin.

  • JSON. scriptA.py сбрасывает словарь в stdout. scriptB.py загружает словарь из stdin.

Это уже встроено в Python и занимает очень мало кода.

В scriptA, json.dump( {}, sys.stdout ) или pickle.dump( {}, sys.stdout )

В scriptB, json.load( sys.stdin ) или pickle.load( sys.stdin )

  • 2
    ИСКЛЮЧИТЬ, если он работает в Windows и Python вызывается «ассоциацией файлов» (a.py | b.py) вместо прямой ссылки на исполняемый файл Python (python a.py | python by) или, например, (\ python26 \ python a.py | \ python26 \ python) - как он сказал, вы получаете мрачное бормотание о "неверном дескрипторе файла"; это давняя ошибка в Windows cmd.exe. Случайно другой вопрос поднял эту проблему только несколько минут назад.
  • 1
    Сожалею; забыл URL: stackoverflow.com/questions/1057638/…
Показать ещё 2 комментария
2

Труба просто ставит stdout из A в stdin из B.

A делает:

import sys
sys.stdout.writelines(output)

B просто делает:

import sys
input = sys.stdin.readlines()
0

Когда вы что-то прокладываете, вы (обычно) подаете стандартный вывод одной программы в стандартный ввод другого. Я думаю, вам следует продолжать этот путь.

Если у вас возникли проблемы с тем, что вы можете читать ваш первый script с вашей секундой, посмотрите этот вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню