Является ли подпроцесс единственным способом обеспечить ввод для input ()? - PullRequest
0 голосов
/ 12 января 2012

Я пытаюсь понять, как работает input.

Приведена, например, простая функция, такая как:

def f():
    s = input()
    print(s)

Есть способ вызвать f и заставить его напечататьчто-то без построения конвейеров?

Очевидно, не вводя ничего в терминологию.

Ответы [ 4 ]

2 голосов
/ 12 января 2012

Один из способов сделать это - временно переопределить sys.stdin.

например:

import sys
from StringIO import StringIO

input_text = 'whatever you want the function to read from input()'

old_stdin = sys.stdin
#Reassign stdin to a StringIO object
sys.stdin = StringIO(input_text)

f()

sys.stdin = old_stdin
1 голос
/ 12 января 2012

Да, выполнение второй оболочки Python в подпроцессе является единственным способом ввода input (если вы не хотите переопределить input в модуле).

Вместо этого вы должны читать из произвольного файла (и сделать значение по умолчанию sys.stdin). Затем вы можете просто установить другой файл - либо временный на диске, либо объект типа StringIO.

import sys,StringIO
def f(inputfile=sys.stdin):
    s = inputfile.readline()
    print(s)

# To test, call it like this:
f(StringIO.StringIO('testdata\n'))
0 голосов
/ 12 января 2012

Нельзя предоставить текст по умолчанию для input () .

Но если вы используете Linux и Bash, вы можете сделать что-то вроде этого:

import readline

def rlinput(prompt, prefill=''):
   readline.set_startup_hook(lambda: readline.insert_text(prefill))
   try:
      return raw_input(prompt)
   finally:
      readline.set_startup_hook()

rlinput("Do you want to delete all files?  ", "yes")

(изменено из этого SO-ответа ).

Смотри также:

0 голосов
/ 12 января 2012

Не то, чтобы я обязательно рекомендовал это решение, но вы можете привязать input к другой функции ...

...