子进程是为input()提供输入的唯一方法吗?

时间:2012-01-12 13:31:58

标签: python input subprocess

我试图理解input的工作方式。

举例说明一个简单的函数:

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

有一种方法可以调用f并使其在不构建管道的情况下进行打印吗?

显然没有在termimal中输入任何内容。

4 个答案:

答案 0 :(得分:2)

这样做的一种方法是暂时重新定义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 :(得分:1)

是的,在子进程中执行第二个python shell是向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'))

答案 2 :(得分:0)

并非我一定会推荐此解决方案,但您可以将input重新绑定到其他功能...

答案 3 :(得分:-1)

您无法向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-answer修改)。

另见: