Hatena::Groupfukuoka-py

ikikko.py このページをアンテナに追加 RSSフィード

2008-12-15

DLLをスクリプト上で読込

22:42 |  DLLをスクリプト上で読込 - ikikko.py を含むブックマーク はてなブックマーク -  DLLをスクリプト上で読込 - ikikko.py  DLLをスクリプト上で読込 - ikikko.py のブックマークコメント

PythonからActiveX(on Trac Lightning) - ikikko.py - fukuoka.pyのはてなグループでやったんだけども、やっぱりユーザに事前にDLLをセットさせるなんてことはやらせるのもどうかなと。極力、プラグインは事前準備無しで動くようにしておきたいものですし。

じゃあどうすればいいかなというと、スクリプト上で動的にDLLを読み込みばいっかと。動的に指定する分若干遅くなりそうだけど、無視できる程度でしょう、多分w


今回参考にしたサイトはこちら。

手順としては、

  1. TracLightningをインストールすると自動で登録される環境変数「TRACPATH」を引っ張ってくる
  2. 1で引っ張ってきたパス以下を「os.walk」で順次参照する
  3. 「pythoncomXX.dll*1」が見つかったら、その時点で「os.walk」を抜ける
  4. 「pythoncomXX.dll」のパスを引数に、「ctypes.windll.LoadLibrary」を呼び出す

実際に試してみると、こんな感じ。

#/usr/bin/env python
# -*- coding: utf-8 -*-

import ctypes
import os
import re


def __getpythoncompath():
    """ Return 'pythoncomXX.dll' path."""
    pattern = re.compile("pythoncom\d{2}\.dll")

    for tracpath in os.environ.get("TRACPATH", "").split(";"):
        for dpath, dnames, fnames in os.walk(tracpath):
            for fname in fnames:
                if pattern.search(fname):
                    return os.path.join(dpath, fname)

ctypes.windll.LoadLibrary(__getpythoncompath())
import win32com.client


if __name__ == '__main__':
    excel = win32com.client.Dispatch("Excel.Application")
    excel.Visible = True
    excel.Workbooks.Add()
    excel.Cells(1, 1).value = u"初めてのExcel"

これで、DLLの事前セット無しにActiveXを使えるようになりましたと。

*1:XXはバージョン番号

IskeeIskee2012/02/22 17:38HHIS I should have tohguht of that!