【问题标题】:Enter to raw_input automatically自动进入 raw_input
【发布时间】:2015-07-06 06:29:32
【问题描述】:

作为一个例子,它可能看起来不合逻辑。我有一个如下的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?

【问题讨论】:

  • 如果是您自己的脚本,只需将信息输入(raw_input 调用)与处理解耦即可。如果是不提供“批处理模式”的第三方糟糕 API,请按照 Anand S Kumar 的建议进行操作,但请记住,这有点麻烦......

标签: python


【解决方案1】:

您也可以将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 包。

【讨论】:

  • 不错!但它在 jupyter notebook 上不起作用,知道如何改进它吗?
【解决方案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")

【讨论】:

  • 这是一个可以接受的答案。但是我会从ask_user_name 中拆分say_hello 函数。
【解决方案3】:

您可以将您的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() 将从 &lt;filename&gt; 文件中读取。

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

请注意,在重定向这样的输入时应该小心。

【讨论】:

    【解决方案4】:

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

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

    然后出于测试目的,您可以传入一个满足您需要的函数:

    get_name(lambda prompt: "John Smith")
    

    【讨论】:

      【解决方案5】:

      对于 Python3 用户

      import sys
      from io import StringIO
      
      def getInput():
          value = input()
          print(value)
      
      sys.stdin = StringIO('test')
      getInput()
      

      输出:

      test
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-27
        • 2013-08-19
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        相关资源
        最近更新 更多