Python / win32com / try和除/检查应用程序是否正在运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python / win32com / try和除/检查应用程序是否正在运行相关的知识,希望对你有一定的参考价值。
我在Windows 7上使用python 3.6.2。
我有一个小功能,应该检查MS Excel是否已经运行。功能有点奇怪,在这里你的帮助将非常感激。
如果Excel正在运行,该函数应检查。如果是,请打印文本并退出应用程序。如果不是,一切都很好,继续。
我现在的问题是,当Excel运行时,执行try-block包括打印但不执行sys.exit(),并执行except-block!如果Excel没有运行,那么一切都很好,try-block中止,只执行except-block。
当Excel运行时,为什么它会执行两个打印语句?
请帮忙!
这是我的代码:
def check_if_Excel_runs():
import win32com.client
import sys
try:
win32com.client.GetActiveObject("Excel.Application")
# If there is NO error at this stage, Excel is already running
print('Excel is running, please close first')
sys.exit()
except:
print('Excel is NOT running, this is good!')
return
check_if_Excel_runs()
我的输出(当Excel运行时):
Excel is running, please close first
Excel is NOT running, this is good!
提前致谢!
更新:
好吧,我已经理解,我不应该一般做“除了”而不指定我想要处理的异常。但是我如何确定我要捕获的异常类型。如果我查看错误消息,我不清楚。
com_error Traceback (most recent call last)
<ipython-input-39-70980aa1c5df> in <module>()
11 return
12
---> 13 check_if_Excel_runs()
<ipython-input-39-70980aa1c5df> in check_if_Excel_runs()
3 import sys
4 try:
----> 5 win32com.client.GetActiveObject("Excel.Application")
6 # If there is NO error at this stage, Excel is already running
7 print('Excel is running, please close first')
c:userschnnappdatalocalprogramspythonpython36-32libsite-packageswin32comclient\__init__.py in GetActiveObject(Class, clsctx)
77 """
78 resultCLSID = pywintypes.IID(Class)
---> 79 dispatch = pythoncom.GetActiveObject(resultCLSID)
80 dispatch = dispatch.QueryInterface(pythoncom.IID_IDispatch)
81 return __WrapDispatch(dispatch, Class, resultCLSID = resultCLSID, clsctx = clsctx)
com_error: (-2147221021, 'Operation unavailable', None, None)
伙计们,再次感谢您的帮助!
它发生是因为sys.exit()也抛出异常。
我相信你的问题是sys.exit()抛出异常。
Sys.exit()通过抛出系统退出异常退出。你不能把它放在那里,只是使用一般的catch all语句。
希望这可以帮助!
从sys.exit()上的python文档中,您可以看到问题所在:
这是通过引发SystemExit异常来实现的,因此可以遵循try语句的finally子句指定的清除操作,并且可以拦截外层的退出尝试。
所以会发生的是sys.exit()
正在执行并尝试通过抛出SystemExit异常来结束程序。但是因为你写了一个泛型,除了你捕获异常然后打印消息。
因此,您可以提供一个很好的示例,说明为什么编写泛型异常是一个坏主意,因为您最终可能会捕获您不想捕获的异常。你应该寻找那种异常的类型
win32com.client.GetActiveObject("Excel.Application")
抛出,只抓住这里。
以上是关于Python / win32com / try和除/检查应用程序是否正在运行的主要内容,如果未能解决你的问题,请参考以下文章