Hatena::Grouppython

nelnal@python

2009-09-25

[] pywin32 の rev.214 にバグがあってハマった件 16:02  pywin32 の rev.214 にバグがあってハマった件 - nelnal@python を含むブックマーク はてなブックマーク -  pywin32 の rev.214 にバグがあってハマった件 - nelnal@python

OLE関連でハマったのでメモ。


問題点1

makepy.py で使用したOLEファイルがPythonバージョンアップによる変更を受けて使えなくなっている。


問題が発生する条件
  • アプリOLEファイルを生成している場合(つまりmakepy.pyを使用してファイルを作成した場合 → 参考
    • OLEファイルの生成を行った時のPythonのバージョンが「2.5以前」
    • 上記生成ファイルを読み込んで使用している。
  • Python のバージョンを「2.6」以上に乗り換えた場合。

特に py2exe での仕様を前提としてOLEファイル(モジュール)を何らかの形で読み込んでいる場合。


解決方法

素直にOLEファイルを再生成すれば良い。



・・・が、以下の問題が発生。


問題点2

makepy.py を使用してファイルを生成する時にエラーになる。

エラー内容

C:\>Python26\Lib\site-packages\win32com\client>python makepy.py -o ole_test.py
Building definitions from type library...
Traceback (most recent call last):
    ...
AssertionError: <open file 'ole_test.py', mode 'w' at 0xXXXXXXXX>

前提条件
  • 使用している pywin32 のバージョンが 214*1

解決策

makepy.py の記載を変更する。


変更前(367行目から)

    if outputName is not None:
        path = os.path.dirname(outputName)
        if path is not '' and not os.path.exists(path):
            os.makedirs(path)
        f = open(outputName, "w")
    else:
        f = None

変更後

371行目をコメントアウトして2行追加する

    if outputName is not None:
        path = os.path.dirname(outputName)
        if path is not '' and not os.path.exists(path):
            os.makedirs(path)
        #f = open(outputName, "w")
        import codecs
        f = codecs.open(outputName, mode="w", encoding="mbcs")
    else:
        f = None

詳細はこちら(ML:patch to makepy.py / genpy.py)に記載がある。

*1:問題としてはrev. 213が原因になっている模様

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090925