鱼C论坛

 找回密码
 立即注册
查看: 3242|回复: 13

请问有没有办法让python在input的时候执行命令?

[复制链接]
发表于 2020-10-24 21:34:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想写出一个程序,让用户在10秒钟之内输入答案,如果10秒钟之内用户没有输入,则继续运行一些其他程序。请问有办法这样写吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-24 21:39:23 | 显示全部楼层
后面加上time.sleep(10)然后if判断input里有没有输入值,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-24 22:01:23 | 显示全部楼层
v.ki 发表于 2020-10-24 21:39
后面加上time.sleep(10)然后if判断input里有没有输入值,

emmm没明白。请问您可不可以写一行代码(形象一点)呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-24 22:34:42 | 显示全部楼层
v.ki 发表于 2020-10-24 21:39
后面加上time.sleep(10)然后if判断input里有没有输入值,

没有任何用,这个得多线程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-24 22:35:53 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-10-24 22:34
没有任何用,这个得多线程

那请问你知道要怎么多线程吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-24 22:39:09 | 显示全部楼层
本帖最后由 聂嘉辉 于 2020-10-24 22:44 编辑



我知道:
from threading import Thread
import time
import sys, msvcrt

def input_value(*n):
    global value
    chars = []
    print(''.join(n), end='')
    while True:
        newChar = msvcrt.getch()
        if newChar in b'\r\n': # 如果是换行,则输入结束
            break
        elif newChar == b'\b': # 如果是退格,则删除末尾一位
            if chars:
                del chars[-1]
                sys.stdout.write('\b')
    value = ''.join(chars)

value = ''
th = Thread(target = input_value, args = 'input a value:')
th.start()
th.join(timeout=10)   #设置超时时间
print(value)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-24 22:48:59 | 显示全部楼层
聂嘉辉 发表于 2020-10-24 22:39
记得最佳答案

我知道:

哪有这么麻烦……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-24 22:50:27 | 显示全部楼层

你有本事你做呀!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-24 22:52:24 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-10-24 22:34
没有任何用,这个得多线程

我的错,没认真看题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-24 22:53:21 | 显示全部楼层
就是不要用input会导致阻塞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 12:40:45 | 显示全部楼层
本帖最后由 Stubborn 于 2020-10-25 12:42 编辑
@func_set_timeout(10)
def askChoice():
    return input('yes or no:')

try:
    s = askChoice()
except FunctionTimedOut as e:
    s = 'f'
print(s)
import copy
import ctypes
import os
import sys
import threading
import types
from functools import wraps

RETRY_SAME_TIMEOUT = 'RETRY_SAME_TIMEOUT'


class FunctionTimedOut(BaseException):

    def __init__(self, msg='', timedOutAfter=None, timedOutFunction=None, timedOutArgs=None, timedOutKwargs=None):

        self.timedOutAfter = timedOutAfter

        self.timedOutFunction = timedOutFunction
        self.timedOutArgs = timedOutArgs
        self.timedOutKwargs = timedOutKwargs

        if not msg:
            msg = self.getMsg()

        BaseException.__init__(self, msg)

        self.msg = msg

    def getMsg(self):
        if self.timedOutFunction is not None:
            timedOutFuncName = self.timedOutFunction.__name__
        else:
            timedOutFuncName = 'Unknown Function'
        if self.timedOutAfter is not None:
            timedOutAfterStr = "%f" % (self.timedOutAfter,)
        else:
            timedOutAfterStr = "Unknown"

        return 'Function %s (args=%s) (kwargs=%s) timed out after %s seconds.\n' % (
            timedOutFuncName, repr(self.timedOutArgs), repr(self.timedOutKwargs), timedOutAfterStr)

    def retry(self, timeout=RETRY_SAME_TIMEOUT):
        if timeout is None:
            return self.timedOutFunction(*(self.timedOutArgs), **self.timedOutKwargs)

        if timeout == RETRY_SAME_TIMEOUT:
            timeout = self.timedOutAfter

        return func_timeout(timeout, self.timedOutFunction, args=self.timedOutArgs, kwargs=self.timedOutKwargs)


class StoppableThread(threading.Thread):

    def _stopThread(self, exception, raiseEvery=2.0):
        if self.is_alive() is False:
            return True

        self._stderr = open(os.devnull, 'w')
        joinThread = JoinThread(self, exception, repeatEvery=raiseEvery)
        joinThread._stderr = self._stderr
        joinThread.start()
        joinThread._stderr = self._stderr

    def stop(self, exception, raiseEvery=2.0):
        return self._stopThread(exception, raiseEvery)


class JoinThread(threading.Thread):

    def __init__(self, otherThread, exception, repeatEvery=2.0):
        threading.Thread.__init__(self)
        self.otherThread = otherThread
        self.exception = exception
        self.repeatEvery = repeatEvery
        self.daemon = True

    def run(self):

        self.otherThread._Thread__stderr = self._stderr
        if hasattr(self.otherThread, '_Thread__stop'):
            self.otherThread._Thread__stop()
        while self.otherThread.is_alive():
            ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(self.otherThread.ident),
                                                       ctypes.py_object(self.exception))
            self.otherThread.join(self.repeatEvery)

        try:
            self._stderr.close()
        except:
            pass


def func_timeout(timeout, func, args=(), kwargs=None):
    def raise_exception(exception):
        raise exception[0] from None

    if not kwargs:
        kwargs = {}
    if not args:
        args = ()

    ret = []
    exception = []
    isStopped = False

    def funcwrap(args2, kwargs2):
        try:
            ret.append(func(*args2, **kwargs2))
        except FunctionTimedOut:
            pass
        except Exception as e:
            exc_info = sys.exc_info()
            if isStopped is False:
                e.__traceback__ = exc_info[2].tb_next
                exception.append(e)

    thread = StoppableThread(target=funcwrap, args=(args, kwargs))
    thread.daemon = True

    thread.start()
    thread.join(timeout)

    stopException = None
    if thread.is_alive():
        isStopped = True

        class FunctionTimedOutTempType(FunctionTimedOut):
            def __init__(self):
                return FunctionTimedOut.__init__(self, '', timeout, func, args, kwargs)

        FunctionTimedOutTemp = type(
            'FunctionTimedOut' + str(hash("%d_%d_%d_%d" % (id(timeout), id(func), id(args), id(kwargs)))),
            FunctionTimedOutTempType.__bases__, dict(FunctionTimedOutTempType.__dict__))

        stopException = FunctionTimedOutTemp
        thread._stopThread(stopException)
        thread.join(min(.1, timeout / 50.0))
        raise FunctionTimedOut('', timeout, func, args, kwargs)
    else:
        thread.join(.5)

    if exception:
        raise_exception(exception)

    if ret:
        return ret[0]


def func_set_timeout(timeout, allowOverride=False):
    defaultTimeout = copy.copy(timeout)

    isTimeoutAFunction = bool(issubclass(timeout.__class__, (
        types.FunctionType, types.MethodType, types.LambdaType, types.BuiltinFunctionType, types.BuiltinMethodType)))

    if not isTimeoutAFunction:
        if not issubclass(timeout.__class__, (float, int)):
            try:
                timeout = float(timeout)
            except:
                raise ValueError(
                    'timeout argument must be a float/int for number of seconds, or a function/lambda which gets passed the function arguments and returns a calculated timeout (as float or int). Passed type: < %s > is not of any of these, and cannot be converted to a float.' % (
                        timeout.__class__.__name__,))

    if not allowOverride and not isTimeoutAFunction:
        def _function_decorator(func):
            return wraps(func)(lambda *args, **kwargs: func_timeout(defaultTimeout, func, args=args, kwargs=kwargs))

        return _function_decorator

    if not isTimeoutAFunction:
        def _function_decorator(func):
            def _function_wrapper(*args, **kwargs):
                if 'forceTimeout' in kwargs:
                    useTimeout = kwargs.pop('forceTimeout')
                else:
                    useTimeout = defaultTimeout

                return func_timeout(useTimeout, func, args=args, kwargs=kwargs)

            return wraps(func)(_function_wrapper)

        return _function_decorator

    timeoutFunction = timeout

    if allowOverride:
        def _function_decorator(func):
            def _function_wrapper(*args, **kwargs):
                if 'forceTimeout' in kwargs:
                    useTimeout = kwargs.pop('forceTimeout')
                else:
                    useTimeout = timeoutFunction(*args, **kwargs)

                return func_timeout(useTimeout, func, args=args, kwargs=kwargs)

            return wraps(func)(_function_wrapper)

        return _function_decorator

    def _function_decorator(func):
        def _function_wrapper(*args, **kwargs):
            useTimeout = timeoutFunction(*args, **kwargs)

            return func_timeout(useTimeout, func, args=args, kwargs=kwargs)

        return wraps(func)(_function_wrapper)

    return _function_decorator
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 16:11:14 | 显示全部楼层


你这也太太太太太夸张了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 18:15:36 | 显示全部楼层
叼辣条闯世界 发表于 2020-10-25 16:11
你这也太太太太太夸张了吧

用起来 很简单的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 22:31:18 | 显示全部楼层
import time
import threading

def A():
    a=input("请输入任意向输入的文字,否则在10秒后会执行其他程序!,输入:")
    print(a)

def B():
    for i in range(5):
        print("---跳转完成---")


def main():
    t1=threading.Thread(target=A)
    t2=threading.Thread(target=B)
    t1.start()
    time.sleep(10)
    t2.start()
不知道是不是你想要的答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 04:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表