Есть ли способ передать 'stdin' в качестве аргумента другому процессу в python?

Я пытаюсь создать сценарий, использующий модуль многопроцессорности с python. Скрипт (назовем его myscript.py) получит ввод от другого скрипта с конвейером.

Предположим, я называю сценарии так:

$ python writer.py | python myscript.py 

А вот коды;

// writer.py
import time, sys

def main():
    while True:
        print "test"
        sys.stdout.flush()
        time.sleep(1)

main()

//myscript.py
def get_input():
    while True:
        text = sys.stdin.readline()
        print "hello " + text
        time.sleep(3)

if __name__ == '__main__':        
    p1 = Process(target=get_input, args=())
    p1.start()

это явно не работает, поскольку объекты sys.stdin различны для основного процесса и p1. Я попытался решить эту проблему

//myscript.py
def get_input(temp):
    while True:
        text = temp.readline()
        print "hello " + text
        time.sleep(3)

if __name__ == '__main__':        
    p1 = Process(target=get_input, args=(sys.stdin,))
    p1.start()

, но столкнулся с этой ошибкой;

Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "in.py", line 12, in get_input
    text = temp.readline()
ValueError: I/O operation on closed file

Итак, я предполагаю, что главный стандартный файл stdin закрыт, и я не могу читать из него. При таком соединении, как я могу передать основной файл stdin другому процессу? Если передача stdin невозможна, как я могу использовать stdin main из другого процесса?

обновление: Хорошо, мне нужно прояснить свой вопрос, поскольку люди думают, что в многопроцессорной обработке нет необходимости. рассмотрите myscript.py следующим образом;

//myscript.py
def get_input():
    while True:
        text = sys.stdin.readline()
        print "hello " + text
        time.sleep(3)

def do_more_things():
    while True:
        #// some code here
        time.sleep(60*5)

if __name__ == '__main__':        
    p1 = Process(target=get_input, args=())
    p1.start()

    do_more_things()

так что мне действительно нужно запускать функцию get_input () параллельно с основной функцией (или другими подпроцессами). Приносим извинения за конфликты, я неплохо владею английским, и, полагаю, я не мог четко ответить на этот вопрос. Буду признателен, если вы скажете мне , могу ли я использовать объект STDIN основных процессов в другом процессе .

заранее спасибо.

16
задан Muhammet Can 23 January 2012 в 21:45
поделиться