在Python3中“try”表示“duration”

在Python3中“try”表示“duration”,python,time,outlook,Python,Time,Outlook,我正在研究如何让我的python尝试完成一个可能永远不会发生的操作,直到相当于一个计时器的东西用完,在这种情况下,它运行一个单独的函数 确切的情况是,当自动化系统的某个部分尝试访问outlook时,绕过outlook提供的警告屏幕。当发送初始命令从outlook检索数据或以其他方式操作outlook时,整个python脚本将停止并尽可能地等待,等待用户在outlook程序上单击“允许”,然后继续。我想发生的是,当它试图操纵outlook时,会有一个计时器启动。如果计时器达到X值,请跳过发送到ou

我正在研究如何让我的python尝试完成一个可能永远不会发生的操作,直到相当于一个计时器的东西用完,在这种情况下,它运行一个单独的函数

确切的情况是,当自动化系统的某个部分尝试访问outlook时,绕过outlook提供的警告屏幕。当发送初始命令从outlook检索数据或以其他方式操作outlook时,整个python脚本将停止并尽可能地等待,等待用户在outlook程序上单击“允许”,然后继续。我想发生的是,当它试图操纵outlook时,会有一个计时器启动。如果计时器达到X值,请跳过发送到outlook的命令,并执行一组不同的操作

我觉得这可能会导致所谓的线程化,以便同时运行进程,但我也觉得这一概念可能过于复杂了。如果我要做一个我认为可以用来实现这一点的模型,这就是我想出来的

time1 = time.clock()
try:
    mail = inbox.Items[0].Sender
except if time1 > time1+10:
    outlookWarningFunc()
我99.9%确信,except从未以这种方式使用过,因此它不是一段功能性代码,但它是我所能想到的最接近的东西,至少能表达我想要表达的内容


谢谢你抽出时间。多谢各位

解决方案之一是:

import threading

mail = None

def func():
    global mail
    mail = inbox.Items[0].Sender

thread = threading.Thread(target=func)
thread.start()

thread.join(timeout=10)
if thread.is_alive():
    # operation not completed
    outlookWarningFunc()
    # you must do cleanup here and stop the thread
您启动一个执行该操作的新线程,并等待10秒钟,直到它完成或超时。然后,检查工作是否完成。如果线程处于活动状态,则表示任务尚未完成


此解决方案的缺点是线程仍在后台运行,因此您必须执行清理操作,以允许线程完成或引发异常。

您可以使用while循环并将while循环包装在try/except子句中以捕获异常anything@PeterWang,我在处理这个问题时也有同样的想法。问题是,一旦点击命令mail=inbox.Items[0].Sender,整个过程就会停止前进。没有后续命令触发,因此我提出了需要线程的理论。我目前正在研究这一解决方案。谢谢你的想法,我很感激这不是try/Exception块,因为Outlook应用程序实际上没有引发任何错误,它正在通过模式对话框等待用户输入。@Cubblewden Outlook可能会显示哪些警告/msg,以及您试图绕过哪些警告/msg?阻塞、超时和选择是您要查找的术语。您需要更多的代码才能使其成为一个,但一般来说,您希望能够使用timeout选择此操作您好,我实现了您建议的代码谢谢您花这么多时间来帮助!但它的结果似乎与我使用While语句的结果相同。该线程将被启动,mail=inbox.Items[0]。发件人将离开,Outlook上会弹出窗口,但不会继续前进。超时时间只有10秒,我在测试中等待了20秒。你认为我现在处境艰难吗p代码正在向前执行,因为正如我所说的,线程仍在运行,窗口弹出并且没有关闭。即使时间到了,线程也不会被终止,但您的脚本会进一步异步运行,您可以在if语句之后放置print来测试它。实际上,杀死一个单独的线程是非常困难的。应该使用一些函数从if语句中的脚本强制关闭窗口。