自动输入raw_input

时间:2015-07-06 06:29:32

标签: python

仅作为一个例子,它可能看起来不合逻辑。我有一个get_name函数,如下所示,想编写一个自动脚本来调用这个函数并自动输入raw_input

def get_name ():
    name = raw_input("Please enter your name : ")
    print "Hi " + name

如下所示的自动脚本,我应该添加什么命令来自动输入我的值?

def run ():
    get_name ()
    // what should I add here?

4 个答案:

答案 0 :(得分:6)

您可以将stdin重定向到某个文件,然后raw_input()将从该文件中读取。

示例 -

def run():
    import sys
    f1 = sys.stdin
    f = open('input.txt','r')
    sys.stdin = f
    get_name()
    f.close()
    sys.stdin = f1

请注意,执行完 - f = open('input.txt','r')sys.stdin = f后,raw_input()会从<filename>文件中读取。

完成get_name()调用后,关闭文件并使用sys.stdin = sys.__stdin__恢复标准输入,如果要将其恢复为控制台输入,则可以将其恢复为f1 ,它将恢复到测试开始前的状态。

请注意,重定向此类输入时应小心。

答案 1 :(得分:5)

您也可以将stdin替换为StringIO(也就是内存文件)而不是真实文件。这样输入的文本将在您的测试代码中,而不是单独的文本文件。

基于Anand S Kumar(+1):

def run():
    import sys
    import StringIO
    f1 = sys.stdin
    f = StringIO.StringIO('entered text') # <-- HERE
    sys.stdin = f
    get_name()
    f.close()
    sys.stdin = f1

此外,对于交互式命令行功能/工具的更复杂测试,您可能需要检查pyexpect包。

答案 2 :(得分:2)

对于测试,您可以通过IO重定向从命令行调用您的脚本 - 请参阅手册中的子流程,但是为了快速解决方案,您可以像这样更改代码,请注意,这不会测试raw_input但只是简单地让您测试周围的代码

def get_name (name=''):
    """ Code to get the name for testing supply name int the call """
    if len(name) == 0:
        name = raw_input("Please enter your name : ")
    print "Hi " + name

def run ():
    get_name ("Fred")

答案 3 :(得分:2)

另一种选择是将输入函数作为参数,默认raw_input

def get_name(infunc=raw_input):
    name = infunc("Please enter your name : ")
    print "Hi " + name

然后出于测试目的,您可以传递一个可以满足您需要的功能:

get_name(lambda prompt: "John Smith")