Я пытаюсь прочитать из sys.stdin изнутри объекта Python Process, но я продолжаю получать результат «ValueError: I/O operation on closed file». Вот простой пример:Чтение из stdin в Python Process?
import sys
from multiprocessing import Process
def do_something(input_data):
for x in input_data:
print x
input=sys.stdin
p = Process(target=do_something, args=(input,))
p.start()
p.join() #Wait for Process to complete
Данный скрипт всегда терпит неудачу с:
Traceback (most recent call last):
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "example.py", line 6, in do_something
for x in input_data:
ValueError: I/O operation on closed file
Просто вызова do_something(input)
отлично работает без использования процесса, конечно. Создание объекта Pipe()
, похоже, помогает - я могу написать содержимое stdin в Pipe и получить результаты в форме строки из процесса, но мне действительно нужен вход в файловую форму для некоторых последующих операций. Я мог бы сбрасывать содержимое в файл и перечитывать его изнутри Процесса, но это кажется довольно неуклюжим, особенно если stdin действительно большой. Есть ли простой способ прочитать из sys.stdin изнутри процесса?
Пример кода, который я опубликовал, демонстрирует проблему, но не содержит явных закрытий файлов, поэтому я уверен, что это не так. Также помните, что «файл» - это sys.stdin, а не обычный файл. – homesalad
Попробуйте изменить 'input = sys.stdin' на' input = sys.stdin.readlines() ' – NendoTaka
Это помогает, но он читает все stdin в памяти, прежде чем продолжить, что является поведением, которое я надеюсь избежать.Вход может быть очень большим, и я бы не прочитал его все до начала процесса. – homesalad