2
def foo():
    return raw_input("answer this question: ")


# some code here then
foo()
# some more code here

foo是第 3 方函数调用,它以某种方式触发输入。

如果我们事先知道答案,我们如何在其中提供答案?没有弹出;我什至没有运行脚本文件。我能想到的一种方法是使用线程?

4

1 回答 1

3

有点不正统,但你可以猴子补丁sys.stdin

# We're going to monkey-patch stdin
import sys
from cStringIO import StringIO
old = sys.stdin
sys.stdin = StringIO('hello')

# Now read from stdin
result = raw_input('foo')

# And replace the regular stdin
sys.stdin = old

这就像您输入 'hello' 作为raw_input. 当然,不是调用raw_input你自己,而是调用你的foo函数。我想如果我要多次这样做,我会使用上下文管理器来确定我撤消了猴子补丁:

import sys
from cStringIO import StringIO

class PatchStdin(object):
    def __init__(self, value):
        self._value = value
        self._stdin = sys.stdin
    def __enter__(self):
        # Monkey-patch stdin
        sys.stdin = StringIO(self._value)
        return self
    def __exit__(self, typ, val, traceback):
        # Undo the monkey-patch
        sys.stdin = self._stdin


# Usage
with PatchStdin('Dan'):
    name = raw_input('What is your name? ')
    print 'Hello, %s' % name
于 2013-07-16T16:21:22.337 回答