win32comで、makepyを使って COM(AcitveX)の定数をロードさせる手順について
Pythonで、COM(ActiveX)を操作する際は、win32com下のクラスを使う事になります。
この時、ActiveXの中でタイプライブラリとして定義している定数値を使えると、コードの可読性が良くなって便利です。
Pythonの場合、win32com.client.constants 下に、定数値が列挙されるようになっていますが、makepyツールを使って予めタイプライブラリ情報をPythonに教えておく必要があります。
それは、以下のWeb siteの記述にも書かれています。
- Rubyist Magazine - Win32OLE 活用法 【第 7 回】 ほかの言語での COM
http://jp.rubyist.net/magazine/?0009-Win32OLE
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 posted by (C)wacky
makepyは、Pythonの「Lib\site-packages\win32com\client\mekepy.py
」にあります。
これを呼び出すと、以下のダイアログが出ます。
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 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をどうぞ。
- COMオブジェクトの定数を使用したスクリプトを py2exe で固める。 - nelnal@python - pythonグループ
http://python.g.hatena.ne.jp/nelnal_programing/20080424/1209024385 - IncludingTypelibs - py2exe.org
http://www.py2exe.org/index.cgi/IncludingTypelibs
そうそう
win32comは、以下からダウンロードしてインストールして下さいね。
- Python for Windows Extensions
http://starship.python.net/crew/mhammond/win32/