Enter to raw_input automatically

前端 未结 4 1792
傲寒
傲寒 2020-12-17 23:42

Just as an example, it might seem illogical. I have a get_name function as below, and wanted to write a automated script to call this function and enter to the raw_inp

相关标签:
4条回答
  • 2020-12-17 23:59

    Another option is to make the input function a parameter, defaulting to raw_input:

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

    Then for testing purposes you can pass in a function that does whatever you need:

    get_name(lambda prompt: "John Smith")
    
    0 讨论(0)
  • 2020-12-18 00:03

    You can also substitute stdin with StringIO (aka memory file) instead of real file. This way the entered text will be in your testing code instead of separate text file.

    based on Anand S Kumar's (+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
    

    Also, for more sophisticated testing of interactive commandline functions/tools you may want to check the pyexpect package.

    0 讨论(0)
  • 2020-12-18 00:18

    You can redirect your stdin to a file , and then raw_input() would read from that file.

    Example -

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

    Please note, after you do - f = open('input.txt','r') and sys.stdin = f , raw_input() would read from the <filename> file.

    Once you are done with the get_name() call, close the file and restore the stdin using sys.stdin = sys.__stdin__ , if you want to restore it back to console input, otherise you can restore it to f1 , which would restore it to the state it was before test started.

    Please note, you should be careful when redirecting inputs like this.

    0 讨论(0)
  • 2020-12-18 00:18

    For testing you could call your script from the command line with IO redirection - see subprocess in the manuals but for a quick solution you could change your code like this, note that this does not test raw_input but lets you simply test the surrounding code:

    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")
    
    0 讨论(0)
提交回复
热议问题