3

私はいくつかの Python/Excel アプリケーションに取り組んできましたが、興味深い問題に遭遇しました。エラーが発生する程度に例を単純化しました。

(警告 - ブレーク機構なしの無限ループ)

from win32com.client import DispatchWithEvents
import msvcrt, pythoncom
import time


def TestExcel():
    class ExcelEvents:
        pass

    class WorkbookEvents:
        pass

    e = DispatchWithEvents("Excel.Application", ExcelEvents)
    e.Visible = 1
    book = e.Workbooks.Add()
    book = DispatchWithEvents(book, WorkbookEvents)

    while True:
        pythoncom.PumpWaitingMessages()
        time.sleep(0.1)


if __name__ == '__main__':
    TestExcel()
    print('Exiting')

実行すると、Excel が開き、新しいワークブックが追加され、アプリケーションまたはワークブック オブジェクトのいずれかでイベントが待機されます。

ワークブックに新しいシートを追加する場合にのみ、Excel で可能なイベントを実行しても (イベント クラスで定義されたハンドラーがないため) 何も起こりません。次のエラーがすぐに生成されます。

pythoncom error: Python error invoking COM method.

Traceback (most recent call last):
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 278, in _Invoke_
    return self._invoke_(dispid, lcid, wFlags, args)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 283, in _invoke_
    return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 650, in _invokeex_
    return DesignatedWrapPolicy._invokeex_( self, dispid, lcid, wFlags, args, kwArgs, serviceProvider)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 586, in _invokeex_
    return func(*args)
TypeError: 'NoneType' object is not callable
pythoncom error: Python error invoking COM method.

Traceback (most recent call last):
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 278, in _Invoke_
    return self._invoke_(dispid, lcid, wFlags, args)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 283, in _invoke_
    return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 650, in _invokeex_
    return DesignatedWrapPolicy._invokeex_( self, dispid, lcid, wFlags, args, kwArgs, serviceProvider)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 586, in _invokeex_
    return func(*args)
TypeError: 'NoneType' object is not callable
pythoncom error: Python error invoking COM method.

Traceback (most recent call last):
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 278, in _Invoke_
    return self._invoke_(dispid, lcid, wFlags, args)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 283, in _invoke_
    return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 650, in _invokeex_
    return DesignatedWrapPolicy._invokeex_( self, dispid, lcid, wFlags, args, kwArgs, serviceProvider)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 586, in _invokeex_
    return func(*args)
TypeError: 'NoneType' object is not callable
pythoncom error: Python error invoking COM method.

Traceback (most recent call last):
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 278, in _Invoke_
    return self._invoke_(dispid, lcid, wFlags, args)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 283, in _invoke_
    return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 650, in _invokeex_
    return DesignatedWrapPolicy._invokeex_( self, dispid, lcid, wFlags, args, kwArgs, serviceProvider)
  File "C:\Users\majkop\AppData\Local\Programs\Python\Python35-32\lib\site-packages\win32com\server\policy.py", line 586, in _invokeex_
    return func(*args)
TypeError: 'NoneType' object is not callable

私は pythoncom.PumpWaitingMessage() の周りに try/except を置くことができることを知っています、そしてそれがpythonicの方法であることを知っています:Dしかし、私はまだこのエラーの原因を知りたいと思っています... 4回続けて


編集:エラーの表示を避けるために、ポンプの周りを試す/除くは機能しません

4

0 に答える 0