1

我在 python 中创建了一个小脚本,我想在其中使用多处理同时执行两个函数。第一个函数将执行目录递归搜索,第二个函数将向用户显示一些问题。尽管创建了 .txt 文件,但问题并未出现。我见过这个问题:Python command line input in a process但作为初学者,我不明白问题是什么以及如何解决它。这是我的脚本:

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()
4

1 回答 1

0

最简单的做法是ask从主进程本身调用:

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

或者你可以使用一个线程:

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()

或者,您可以os.dup 在此处用作 JF Sebastian 节目

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()
于 2013-07-25T13:32:46.780 回答