【发布时间】:2019-04-07 03:21:55
【问题描述】:
使用 Windows,我启动命令提示符并运行我的脚本,这将在后台打开一个 excel 文件。我确实使用 try/except/finally 块来捕获异常并最终关闭工作簿,但似乎如果我在命令提示符下(在代码完全完成运行之前)点击红色的“X”,则 Excel 工作簿保持打开状态。
我最好的猜测是代码完全停止执行,无论它在哪里?
这对我来说并不少见。发生的情况是我意识到我错过了上一步,所以我只想关闭命令提示符和驻留在后台的工作簿。
我最初预计 try/except/finally 会涵盖这种情况:
try:
xl = win32com.client.Dispatch("Excel.Application")
wb = xl.Workbooks.Open(Filename=file)
# Do stuff
# Close out of command prompt while doing stuff
except Exception as e:
print(e)
finally:
wb.Close(SaveChanges=0) # doesn't seem to close out of the workbook
# when command prompt forcefully closed
当失败时,我在其他地方寻找类似的问题,并尝试了“atexit”模块,它似乎也不起作用。
如果用户取消命令提示符,关闭 Excel 工作簿的正确方法是什么?
【问题讨论】:
-
我不认为有办法做你想做的事。如果关闭运行 Python 程序的命令提示符,则只需终止该进程。
try...finally子句不被尊重,就像atexit链中的函数不会被调用一样。在大多数情况下,这就是您想要的。假设您正在运行的程序进入无限循环。您不会希望等待其清理进程被调用,因为程序可能处于如此紧密的循环中,以至于它永远不会调用它们。 -
我是否可以生成一个单独的(未附加的)进程来检查第一个进程是否仍然存在?如果没有,它可以检查某些工作簿是否已关闭?
-
我认为拥有一个仅在认为合适时关闭打开的工作簿的独立进程并不是一个好主意。通过将代码移动到
wxWidgets或TkInter之类的GUI 环境,您可以获得大部分您想要的东西。当你关闭一个 GUI 程序的主窗口时,你通常会得到一个回调,让你有机会关闭文件,比如你确定吗?等等。你仍然可以绕过这个并使用任务管理器故意终止进程,但这太多了更难偶然做到这一点。