在卡在用户输入上的时候突然出现一个循环

时间:2017-01-27 21:09:06

标签: python input exit

我有以下代码来获取用户输入来执行某些任务。我想要的是在完成此模块之外的其他任务时突破用户提示。因此,即使shell显示“输入命令:”,我希望它停止等待来自用户的提示并继续执行其他任务。这是否可能,如果是这样,怎么样?提前致谢。

Workbooks("myFile.xlsm").Sheets(pageFocus).Range(pasteRange).PasteSpecial xlPasteValues
Workbooks("myFile.xlsm").Sheets(pageFocus).Range(pasteRange).PasteSpecial xlPasteFormats

编辑: 实际上这已经在一个线程中并且线程正确关闭。问题是屏幕卡在用户提示符上,即使用户提示在该点没用,因为调用输入的线程已经关闭。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

使用信号

您可以使用signal模块(仅限linux / unix)

import signal


class UserInputTimeoutError(Exception):
    pass


def handler(signum, frame):
    raise UserInputTimeoutError('no input from user')

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

try:
    # This may hang indefinitely
    user_input = raw_input('please insert something here:')
    print('got %s from user' % user_input)

    # cancel the alarm signal
    signal.alarm(0)
except UserInputTimeoutError:
    print('\nno input from user')

输入是'你好':

please insert something here:hello
got hello from user
没有输入5秒时输出

please insert something here:
no input from user


使用选择

另一种选择是使用select.select()进行非阻塞io操作。

get_user_input函数尝试每隔0.1秒读取一次sys.stdin,如果有数据要读取则读取单字节。如果它遇到一个新行,则返回该字符串。

如果超时超过,我们退出返回None

代码:

import select
import sys
import time


def get_user_input(msg, timeout=5):
    print(msg)
    user_input = []
    stime = time.time()

    while time.time() - stime <= timeout:
        readables, _, _ = select.select([sys.stdin], [], [], 0.1)
        if not readables:
            continue
        chr = readables[0].read(1)
        if chr == '\n':
            return ''.join(user_input)
        user_input.append(chr)

user_input = get_user_input('please insert something:')

if user_input is None:
    print('no user input')
else:
    print('input is %s' % user_input)

输入hello select的示例输出:

please insert something:
hello select
input is hello select

例如,当没有输入5秒时:

please insert something:
no user input

Windows支持

如果您出于某种原因使用Windows,则可以查看answer关于msvcrt模块的this solution

select.select基本上相同,非阻塞io使用msvcrt.kbhit()来检查用户是否返回了输入。

如果您需要更多信息,请更新您的操作系统。

答案 1 :(得分:0)

我认为您可以使用此答案读取直到超时,然后检查变量并在变量设置为false时退出。如果没有,那么再次尝试阅读。

https://stackoverflow.com/a/2904057/2066459

    GIT_MERGE_AUTOEDIT=no