如果没有给出输入,则使用默认值继续执行程序

Posted

技术标签:

【中文标题】如果没有给出输入,则使用默认值继续执行程序【英文标题】:Continue program execution with default value if no input given 【发布时间】:2022-01-08 19:57:47 【问题描述】:

我正在创建一个 selenium 脚本来自动填充某些网站上的凭据。现在我想填写多个凭据,所以我创建了一个dict,其中包含各种配置文件及其凭据。所以每个用户只需要在脚本开始时选择他的个人资料。

dict 的示例如下所示:

credentials = 
'Default': ['default_user', 'default_password'],
'Adam': ['adam_user', 'adam_password'],
'Linus': ['linus_user', 'linus_password']

现在,每当脚本启动时,它都会要求用户选择任何配置文件。

Choose your profile:
1. Default
2. Adam
3. Linus

说到重点,我希望脚本在no input 的情况下自动选择默认配置文件,现在在你开始写答案之前让我详细说明一下。

我的意思是没有输入,因为用户是 afk(远离键盘),而不是用户按下回车并发送空输入,所以脚本应该要求选择一个配置文件,以防没有输入让我们假设 5 秒,脚本应该使用默认配置文件继续前进。

我希望它像这样工作,这样我就可以安排它在我的本地机器上随时运行(不管我是否睡着)并做任何我想做的事情。

感谢您的帮助,感谢您阅读到最后。

【问题讨论】:

您使用的是什么操作系统?我怀疑解决方案可能不是跨平台的。 鹦鹉操作系统(Linux) 我只需要一种方法让 python 脚本在 5 秒后继续使用默认值。不要担心我在双启动的操作系统。 【参考方案1】:

在 Linux 中,您可以使用signal.alarm 安排在一定秒数后发送警报信号。如果您还没有将警报用于其他目的,您可以使用它来创建一个等效于input 的函数,但在给定超时后将返回一些默认值。例如:

import signal

class Alarmed(Exception):
    pass

def handle_alarm(signo, frame):
    raise Alarmed
    
def input_with_timeout(prompt, timeout, default):

    # set SIGALRM handler and save any existing one
    old_alarm_handler = signal.signal(signal.SIGALRM, handle_alarm)

    # arrange for an alarm after specified number of seconds
    signal.alarm(timeout)

    try:
        answer = input(prompt)
    except Alarmed:
        print()
        return default
    finally:
        # switch off any remaining alarm
        signal.alarm(0)
        # restore orig handler
        signal.signal(signal.SIGALRM, old_alarm_handler)  

    return answer


credentials = 
    'Default': ['default_user', 'default_password'],
    'Adam': ['adam_user', 'adam_password'],
    'Linus': ['linus_user', 'linus_password']

key = input_with_timeout('Choose your profile: ', 5, 'Default')

# non-existent key gives the default also
print('you have chosen ', credentials.get(key, 'Default'))

如果进程收到信号SIGALRM,则运行handle_alarm,这会引发我们的自定义异常Alarmed。请注意,无论是否收到警报信号,finally 块中的清除代码都会运行(如果收到,则它将在 return 之前运行)。

尝试输入Adam,或者根本不输入任何内容。

如果您想输入数值,请根据需要调整调用代码。

(通过一些额外的检查,如果我们实际上将alarm 用于其他目的,则可以修改代码以处理这种情况。对signal.alarm 的调用将返回剩余时间,直到任何先前设置的警报信号本来应该被交付的,如果有的话。我们忽略了这个返回值,但它可以用来检测一个现有的预定警报,并在重新安装原始处理程序后重新排队原始警报信号减去清理代码中的任何经过时间。如果原始警报应早于请求的超时时间发送,则需要做出一些决定。)

【讨论】:

这似乎有点太多了,不要误会我的意思,但是没有更短的方法(不导入库)吗? @anantdark 我不知道。如果有,那么也许有人会说。

以上是关于如果没有给出输入,则使用默认值继续执行程序的主要内容,如果未能解决你的问题,请参考以下文章

如果输入文本被删除,则插入默认值

golang函数中的参数为啥不支持默认值

如果值为空,则设置数据库的默认值

10.FastAPI响应体

sql left join - 如果没有结果,则返回默认值

将 index.html 设为默认值,但如果输入则允许访问 index.php