Raw_input inside a Python process
Question: I have created a small script in python where I want to execute two function
on the same time using multiprocessing. The first function would do a
directory recursive search and the second one will display some questions to
the user. Although the .txt file is created the question doesn't appear. I
have seen this question: [Python command line input in a
process](http://stackoverflow.com/questions/5697305/python-command-line-input-
in-a-process) but as a beginner I did not understand what is the problem and
how to solve it. Here's my script:

    
    
    import os
    import thread
    import time
    from multiprocessing import Process
    
    def writeFiles():
        #open a file for writing files in it
        f = open("testFile.txt","w")
        #do the walk
        for root ,dirs,files in os.walk('C:\\Users'):
            for dir in dirs:        
                if dir.startswith('Test'):
                    for root ,dirs,files in os.walk('C:\\Users\\' + dir +'\Desktop'):
                        for file in files:
                            if file.endswith('.txt'):                        
                                #include the full path
                                f.write( os.path.join(root, file + "\n") )
    
        #close the file
        f.close()
    
    def ask():
        a = raw_input('Your name? ')
        if a == 'Tester':
            print 'Hello'
        else:
            print 'Bye'   
    
    
    if __name__ == '__main__':   
    
    # create processes
    p1 = Process( target = writeFiles)
    p2 = Process( target = ask)
    p1.start()
    p2.start()
    


Answer: The simplest thing to do would be to call `ask` from the main process itself:

    
    
    if __name__ == '__main__': 
        p1 = Process(target = writeFiles)   
        p1.start()
        ask()
    

Or you could use a thread:

    
    
    import threading
    import multiprocessing as mp
    import sys
    
    def ask(stdin):
        print 'Your name? ',
        a = stdin.readline().strip()
        if a == 'Tester':
            print 'Hello'
        else:
            print 'Bye'   
        stdin.close()
    
    def writeFiles():
        pass
    
    if __name__ == '__main__': 
        p1 = mp.Process(target=writeFiles)   
        p1.start()
        t1 = threading.Thread(target=ask, args=(sys.stdin,))
        t1.start()
        p1.join()
        t1.join()
    

* * *

Or, you could use `os.dup` [as J.F. Sebastian shows
here](http://stackoverflow.com/a/8981813/190597):

    
    
    import multiprocessing as mp
    import sys
    import os
    
    def ask(stdin):
        print 'Your name? ',
        a = stdin.readline().strip()
        if a == 'Tester':
            print 'Hello'
        else:
            print 'Bye'   
        stdin.close()
    
    def writeFiles():
        pass
    
    newstdin = os.fdopen(os.dup(sys.stdin.fileno()))
    
    if __name__ == '__main__': 
        p1 = mp.Process(target=writeFiles)   
        p1.start()
        p2 = mp.Process(target=ask, args=(newstdin,))
        p2.start()
        p1.join()
        p2.join()
    

