カテゴリー
Uncategorized

Python のアプリケーションへの埋め込みについて

セットアップ用のパッケージ python-X.X.X.msi を使わないで使う際の注意。結構面倒くさい。

Python 2.6

SxS の関係上、Microsoft Visual C++ 2008 Redistributable Package をインストールする必要がある。

必要なバイナリは python26.dll のみ。

sys.path

sys.path を考慮しなくてよい方法は、使用するライブラリを初期状態でも import できるように適切に配置することである。

  • C:\PythonXX\Lib 以下を pythonXX.zip としてパッケージする。*.py/*.pyc/*.pyo のいずれでも良い。
  • C:\PythonXX\DLLs 以下はアプリケーション *.exe のあるディレクトリにコピーする。*1

py2exe などを参考にすると良い。

そうでない場合は sys.path を設定する必要がある。sys.path の初期状態は

[
'pythonXX.dll のあるディレクトリ\\pythonXX.zip',
'.\\DLLs',
'.\\lib',
'.\\lib\\plat-win',
'.\\lib\\lib-tk',
'アプリケーション *.exe のあるディレクトリ',
]

である。Py_Initialize() すると import site しようとするが、おそらく見つからないだろう。*2

そこで独自の site.py を作成し、sys.path に登録されているディレクトリに配置することになる。

import sys
_names = sys.builtin_module_names
if 'posix' in _names:
pass
elif 'nt' in _names:
import nt as os
#ここでパスを追加する
#os.path は使用できない
#elif 'os2' in _names:
#    if sys.version.find('EMX GCC') == -1:
#        import ntpath as path
#    else:
#        import os2emxpath as path
#elif 'mac' in _names:
#    import macpath as path
#elif 'ce' in _names:
#    import ntpath as path
#elif 'riscos' in _names:
#    import riscospath as path
if __name__ == 'site':
sys.modules['sitecustomize'] = sys.modules['site']
del sys.modules['site']
import site
for path in sys.path[:]:
site.addsitedir(path)

もし python.exe も使いたいなら上のスクリプト site.py を sitecustomize.py としても配置しておくと良い。

site.py

sys.path へのパスの追加はこのスクリプトが行う。pythonXX.dll は上にある sys.path の初期状態の設定とレジストリからの参照だけを行う。

pywin32

pythoncom2X.dll と pywintypes2X.dll は %windir%\system32 にコピーするべきである。

*1:py2exe を用いると pythonXX.zip に配置することが可能

*2:Python が正常にセットアップされている場合は C:\PythonXX\Lib\site.py が呼び出され、違う挙動となる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です