2017-01-05 1 views
1

Я пытаюсь выполнить следующее на python.Пользовательские stdout и stdin для записи и чтения данных в том же модуле - Python

Способ 1 записывает выходные данные в пользовательский stdout (StringIO), из которого читается метод 2. Код идет как этот

import sys 
from StringIO import StringIO 

stringIOObj = StringIO() 
default_stdout = sys.stdout 
default_stdin = sys.stdin 
sys.stdout = stringIOObj 
sys.stdin = stringIOObj 

def method1_write(): 
     sys.stdout.write("Hello World\n") 
     sys.stdout.write("\n") #End of line 
     sys.stdout.flush() 

def method2_read(): 
     sys.stdout = default_stdout 
     for line in sys.stdin: 
      print line 

if __name__ == "__main__": 
     method1_write() 
     method2_read() 
     sys.stdin = default_stdin 

цель заключается в два способа общаться через пользовательский стандартный вывод и стандартный ввод. Я мог бы решить это по-другому, но я пытаюсь устранить несколько строк в командной строке, используя методы записи и чтения в том же модуле.

В этом случае, нет никакого вывода не написан

>>> 
>>> 

Не уверен, что не так с этим подходом, когда нет никакой ошибки выброшен, а также.

ответ

1

Проблема связана с тем, что вы используете тот же буфер. После того, как вы написали, позиция файла заканчивается, поэтому вы ничего не читаете! Итак, в какой-то момент перед тем, как вы прочтете, вы должны seek(0). Это работает:

def method1_write(): 
     sys.stdout.write("Hello World\n") 
     sys.stdout.write("\n") #End of line 
     sys.stdout.flush() 
     sys.stdout.seek(0) 

В любом случае для достижения этой цели определенно нужно использовать некоторые из контекстных менеджеров. Проверьте этот вопрос на Просмотр Кода:

https://codereview.stackexchange.com/questions/98393/context-managers-that-also-deal-with-sys-stdin-and-sys-stdout

+0

Это чище. Я буду использовать Context Manager для этих проблем. – sysuser

+1

@sysuser Если вы используете Python 3, функция 'print' принимает аргумент ключевого слова' file', который позволяет вам писать в этот файл с печатью. Вы можете получить эту функцию, используя 'from __future__ import print_function' в Python 2. –

+0

спасибо, что облегчит мою задачу. – sysuser

0

Более опытные эксперименты нашли быстрое решение. Следующие работы.

import sys 
from cStringIO import StringIO 

stringIOObj = StringIO() 
default_stdout = sys.stdout 
sys.stdout = stringIOObj 

def method1_write(): 
     sys.stdout.write("Hello World") 
     sys.stdout.flush() 

def method2_read(): 
     sys.stdout = default_stdout 
     customStdIn = StringIO(stringIOObj.getvalue()) 
     for line in customStdIn: 
      print line 

if __name__ == "__main__": 
     method1_write() 
     method2_read() 

Это печатает то, что я хотел.

>>> 
Hello World 
>>> 

Не знаете, почему тот же объект StringIO не может использоваться как для ввода, так и для вывода.

Смежные вопросы