ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

win32comで、makepyを使って COM(AcitveX)の定数をロードさせる手順について

Pythonで、COM(ActiveX)を操作する際は、win32com下のクラスを使う事になります。
この時、ActiveXの中でタイプライブラリとして定義している定数値を使えると、コードの可読性が良くなって便利です。


Pythonの場合、win32com.client.constants 下に、定数値が列挙されるようになっていますが、makepyツールを使って予めタイプライブラリ情報をPythonに教えておく必要があります。
それは、以下のWeb siteの記述にも書かれています。

Python では、タイプライブラリで定義された定数を利用できます。 Ruby では、指定したモジュール内に定義されますが、Python では win32com.client.constants という名前空間で定義されます。
''COM の定数を利用するには、あらかじめ MakePy ユーティリティを使って、利用可能な状態にしておく必要があります。'' MakePy ユーティリティは、PythonWin というツールからメニューで選択できます。


ここでは、その設定手順について簡単に説明します。(時折忘れるので、自分に対してのメモの意味合いもあります。ははは)

準備開始前

例えば、Excelの定数値を設定しようとします。
Pythonから、Excelオブジェクトを操作しようとする場合、大体以下のようにすればOKです。

$ python
Python 2.6.1 (r261:67517, Dec  4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32com.client
>>> o = win32com.client.Dispatch("Excel.Application")
>>> o.Help()  <= ヘルプファイルが開く

この段階で、Excelオブジェクトの定数が使えるか?というと、使えません。
こんな感じです。

>>> win32com.client.constants.__dicts__
[]

mekepyを呼び出す

makepyを呼び出すと、Pythonの「Lib\site-packages\win32com\gen_py」ライブラリフォルダ下に、指定したCOMオブジェクトのキャッシュが出来上がります。
Excelオブジェクトのタイプライブラリをロードする前、例えば以下の様だったとしましょう。
1
1 posted by (C)wacky


makepyは、Pythonの「Lib\site-packages\win32com\client\mekepy.py」にあります。
これを呼び出すと、以下のダイアログが出ます。
2
2 posted by (C)wacky

今回は、Excelオブジェクトを選択します。
すると、以下のように正常終了すると思います。
これで設定準備完了です。

C:\tool2\Python26\Lib\site-packages\win32com\client>python makepy.py
Generating to C:\tool2\Python26\lib\site-packages\win32com\gen_py\00020813-0000-
0000-C000-000000000046x0x1x3.py
Building definitions from type library...
Generating...
Importing module


Lib\site-packages\win32com\client\mekepy.py」フォルダを確認すると、何かファイルが増えているようです。
3
3 posted by (C)wacky

再び使う

再び、Pythonを起動して、Excelオブジェクトをロードします。
すると、win32com.client.constants下に、Excelオブジェクトの定数が辞書形式で入っている事に気づきます。

$ python
Python 2.6.1 (r261:67517, Dec  4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32com.client
>>> o = win32com.client.Dispatch("Excel.Application")
>>> win32com.client.constants
<win32com.client.Constants instance at 0x00C5D3C8>
>>> win32com.client.constants.__dicts__
[{'xlMixedScript': 3, 'xlParamTypeInteger': 4, 'xlExtended': 3, 'xlPivotChartDro
pZone': 32, 'xlWK1FMT': 30, 'xlHairline': 1, 'xlEMDFormat': 10, 'xlExcel4MacroSh
eet': 3, 'xlDialogPageSetup': 7, 'xlRange': 2, 'xlCellTypeAllFormatConditions':
-4172, 'xlShort': 1, 'xlPyramidColClustered': 106, 'xlPinYin': 1, 'xlNoSelection
...
>>> win32com.client.constants.xlEnd
2
>>> win32com.client.constants.xlColorIndexAutomatic
-4105

ちょっとしたテクニック

定数値は辞書形式に入っている為、「あぁ〜、あの定数名の綴り、何だっけ? xlの…」といった時、以下の簡単な関数を作れば対応できます。(10/12追記>__dicts__が2つ以上のケースを忘れてた。orz)

>>> def find_const(find_str):
...   ret = []
...   for i in range(len(win32com.client.constants.__dicts__)):
...     for s in win32com.client.constants.__dicts__[i].keys():
...       if s.find(find_str) >= 0:
...         ret.append(s)
...   return ret
...
>>> find_const("xlE")
['xlExtended', 'xlEMDFormat', 'xlExcel4MacroSheet', 'xlEndSides', 'xlErrorBarInc
ludeBoth', 'xlErrorBarTypeFixedValue', 'xlExternal', 'xlExcel2FarEast', 'xlEditB
ox', 'xlExcel7', 'xlExcel5', 'xlExcel4', 'xlExcel3', 'xlExcel2', 'xlErrorBars',
'xlEditionDate', 'xlExclusive', 'xlErrorBarIncludePlusValues', 'xlEdgeLeft', 'xl
EdgeRight', 'xlExponential', 'xlEqual', 'xlErrorBarIncludeMinusValues', 'xlExcel
4IntlMacroSheet', 'xlErrRef', 'xlErrNA', 'xlEnd', 'xlEPS', 'xlExcelLinks', 'xlEr
rorBarTypeCustom', 'xlEdgeTop', 'xlExcelMenus', 'xlErrValue', 'xlEntireChart', '
xlExcel9795', 'xlErrorBarIncludeNone', 'xlErrDiv0', 'xlEntirePage', 'xlErrorBarT
ypeStDev', 'xlErrNum', 'xlErrorHandler', 'xlEdgeBottom', 'xlExpression', 'xlErro
rBarTypeStError', 'xlErrNull', 'xlErrors', 'xlExcel4Workbook', 'xlErrorBarTypePe
rcent', 'xlErrName']
>>>

win32comって便利ですね。

まだ試していませんが

まだ試していませんが、py2exeでEXE化する時、躓く可能性があるようです。
その際は、以下のWeb siteをどうぞ。

そうそう

win32comは、以下からダウンロードしてインストールして下さいね。