Python - подпроцесс записи в stdin, так что основная программа может читать его из stdin - PullRequest
5 голосов
/ 30 декабря 2011

У меня есть программа на Python, которая принимает ввод от stdin. Теперь я должен написать другую программу и вызвать ее как подпроцесс, чтобы каждый раз, когда я запускаю этот подпроцесс, он считывал данные из другого текстового файла и записывал их в stdin, а затем моя основная программа считывает их из stdin и использует их.

out.py:

from subprocess import Popen, PIPE, STDOUT

import os

import sys

def read():
    p = Popen(['python', 'in.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

    out = p.communicate()

    print out[0]

def main():
    read()

if __name__ == "__main__":
    main()

in.py:

import sys,os

import subprocess

def main():

    f = open("ad.txt","r")

    for line in f:
        print line

if __name__ == "__main__":
    main()

В основном моя проблема здесь в том, что in.py читает весь файл и печатает в STDOUT, который мне не нужен, и скорее он должен сообщать один символ один раз. Если ad.txt имеет вид:

asdfgh

Я должен получить "a", затем "s", затем "d", затем "f" .. и так далее ... один за другим, каждый раз, когда я вызываю функцию, читается следующий символ из файла. Это вещь! Уф !! Пожалуйста, помогите мне, и я получил чертовски много работы! Заранее спасибо: D

1 Ответ

6 голосов
/ 30 декабря 2011

Первая программа должна прочитать из файла (или stdin) и записать в stdout (не stdin). Аналогично, вторая программа должна читать из stdin и записывать в stdout. Теперь вы можете склеить их вместе в командной строке, используя символ трубы:

python first.py | python second.py

Вот и все! Ни одна из программ не должна знать о другой; в этом прелесть использования "конвейерной обработки".

Добавление: конвейерная обработка оболочки работает над буфером. Оболочка слушает первую программу и заполняет буфер своим выводом. Одновременно вторая программа читает из буфера, пока есть, что прочитать, в противном случае она ждет без дела. Связь является одновременной и требует только фиксированного объема памяти.

Пример кода:

# first.py
import sys
for line in open("input.txt"):
    processed_line = process_line(line)
    sys.stdout.write(processed_line)

# second.py
import sys
for line in sys.stdin:
    processed_line = process_line(line)
    sys.stdout.write(processed_line)

Эти примеры работают над строками (что лучше, если вы работаете с текстовыми файлами). Вы можете легко сделать один и тот же байт за байтом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...