一个线程打印,python中的一个线程raw_input

时间:2016-09-12 01:21:22

标签: multithreading python-2.7

我想完成一个python脚本(func),它具有以下功能:

1.有两个线程,一个线程打印一条更新线,显示输入到终端前的剩余时间

2.另一个线程等待我对终端的输入(sys.stdin

3.我的问题是,虽然我使用我的func,如:

print '''input your file path,the default value will be "/root/targets.txt":>'''
get_input_intime([''],'/root/targets.txt',20)

但是我无法输入一个长文件abs路径,因为第一个线程总是打印剩下的时间,而我想实现:

a)终端中有两行

b)第一行作为第一个主题的打印字符串

c)第二行将接受我的输入,因此我可以输入我需要的文件路径,并且不会被第一个线程刷新,如下所示:

在终端:

第一行:sys.stdout.write("%s秒左...请输入你的chioce:> \ r"%timeout)

第二行:(躲过我的输入)

4.我的代码是:

1)在几秒钟内获得chioce,如果没有输入,则返回默认的chioce

2)第一个参数是一个包含unfault chioces的列表。

例如,有4个chioce 1,2,3,4,如果我想将默认的chioce设为2,那么undefault_chioce_list就是[' 1',' 3' ,' 4'],每个列表都是str类型。

3)第二个参数是默认的chioce值

4)第三个参数是输入前的时间(选择)

5)返回值是来自raw_input()

的chioce
class MyThread(threading.Thread):
    def __init__(self,func,args,name=''):
        threading.Thread.__init__(self)
        self.name=name
        self.func=func
        self.args=args
    def run(self):
        self.result=apply(self.func,self.args)
    def get_result():
        return self.result

def get_input_intime(undefault_chioce_list,default_choose,timeout=5):
    default_choose=[default_choose]
    timeout=[timeout]
    choosed=[0]
    chioce=['']
    def print_time_func():
        while (choosed[0]==0 and timeout[0]>0):
            sys.stdout.write("%s seconds left...please input your chioce:>\r" % timeout)
            sys.stdout.flush()
            time.sleep(1)
            timeout[0]-=1
        if choosed[0]==0:
            chioce[0]=default_choose[0]
    def input_func():
        rlist, _, _ = select([sys.stdin], [], [], timeout[0])
        if rlist:
            chioce_and_enter = sys.stdin.readline()
            choosed[0]=1
            if chioce_and_enter[0] not in undefault_chioce_list:
                chioce[0]=default_choose[0]
            else:
                chioce[0]=chioce_and_enter[0]
            print "you choosed %s" % chioce[0]
        else:
            print "\nyou didn't input..."
            print "I will choose the default chioce for you:%s" % default_choose[0]
    time_left_thread=MyThread(print_time_func,())
    input_thread=MyThread(input_func,())
    time_left_thread.start()
    input_thread.start()
    time_left_thread.join()
    input_thread.join()
    return chioce[0]

1 个答案:

答案 0 :(得分:0)

最后,我在下面的代码中实现了它,但是不能在一行中打印剩余时间,它会在行中打印剩余时间: ----------------------输出:---------------------

还剩20秒......请输入你的chioce:>

还剩19秒......请输入你的chioce:>

还剩18秒......请输入你的chioce:>

还剩17秒......请输入你的chioce:>

还剩16秒......请输入你的chioce:>

还剩15秒......请输入你的chioce:>

剩下14秒......请输入你的chioce:>

>这是我的选择线

你选择了

-------------------------端---------------------

import threading
import time
import sys
import readline
class MyThread(threading.Thread):
    def __init__(self,func,args,name=''):
        threading.Thread.__init__(self)
        self.name=name
        self.func=func
        self.args=args
    def run(self):
        self.result=apply(self.func,self.args)
    def get_result():
        return self.result

def get_input_intime(undefault_chioce_list,default_choose,timeout=5):
    default_choose=[default_choose]
    timeout=[timeout]
    choosed=[0]
    chioce=['']
    def print_time_func():
        while choosed[0]==0 and timeout[0]>0:
            time.sleep(1)
            sys.stdout.write('\r'+' '*(len(readline.get_line_buffer())+2)+'\r')
            print "%s seconds left...please input your chioce:>" % timeout[0]
            sys.stdout.write('> ' + readline.get_line_buffer())
            sys.stdout.flush()
            timeout[0]-=1
        if choosed[0]==0:
            chioce[0]=default_choose[0]
    def input_func():
        while choosed[0]==0 and timeout[0]>0:
            s = raw_input('> ')
            #rlist, _, _ = select([sys.stdin], [], [], timeout[0])
            if s or len(s)==0:
                input_value=s
                choosed[0]=1
                if input_value not in undefault_chioce_list:
                    chioce[0]=default_choose[0]
                else:
                    chioce[0]=input_value
                print "you choosed %s" % chioce[0]
    time_left_thread=MyThread(print_time_func,())
    input_thread=MyThread(input_func,())
    time_left_thread.start()
    input_thread.setDaemon(True)
    input_thread.start()
    time_left_thread.join()
    if choosed[0]==0:
        print "i choose the default chioce for you:%s" % chioce[0]
    return chioce[0]
get_input_intime(['a','b','c'],'d',20)