3

をインポートするPython2.7プログラムがありwin32clipboardます。インストールMSIを作成するために、Windows XPSP332ビットでcx_Freeze4.2.3を使用してフリーズしようとしました。cx_Freezeのドキュメントに従って作成setup.pyし、次のコマンドを使用しました。

c:\python27\python.exe setup.py bdist_msi

Python 2.7がインストールされていない別のPCで実行すると、次をインポートする行で例外が発生しますwin32clipboard

ImportError: DLL load failed: The specified module could not be found.

それがビルドに含まれているwin32clipboard.pyd ことがわかります。

どのような依存関係が欠落していますか?また、それが含まれていることを確認するにはどうすればよいですか?

4

2 に答える 2

4

私は最終的にそれが含まれていることwin32clipboard.pyd 理解しましたが、cx_Freezeがコピーしていないwin32clipboard.pydに依存します。pywintypes27.dllc:\windows\system32

短期的なハックは、手動でにコピーc:\windows\system32\pywintypes27.dllしてから、再度build\exe.win32-2.7実行することです。setup.py bdist_msi

改善されたハックは、setup.pyで以下を使用することです。

import os
import sys
import win32api
...
pywintypes_dll = 'pywintypes{0}{1}.dll'.format(*sys.version_info[0:2])      # e.g. pywintypes27.dll
build_exe_options = {..., "include_files": [ (os.path.join(win32api.GetSystemDirectory(), pywintypes_dll), pywintypes_dll)]}
...
setup(  ...,
        options = { 'build_exe': build_exe_options, 
                    ...,
                  },
        ...)

(依存関係を自動的に検出するようにcx_Freezeを改善することが望ましいですがpywintype27.dll、それは常に進行中の作業だと思います。)

于 2012-06-21T02:02:23.783 に答える
2

cx_Freezeは、この種の状況を処理するためにフッキングメカニズムを使用します。フックはモジュールに保存されますcx_Freeze.hooks。各フックの名前は、調査中のアクション、ロードまたは欠落、およびモジュール名に基づいています。モジュール自体は多くの例を提供します。

win32clipboardモジュールの処理方法は次のとおりです。

from cx_Freeze import hooks
def load_win32clipboard(finder, module):
    finder.IncludeModule("pywintypes")

hooks.load_win32clipboard = load_win32clipboard
...

これで、cx_Freezeがwin32clipboardに遭遇すると、pywintypesも含まれます。cx_Freezeには、適切なファイルをコピーするpywintypesフックがすでにあります。

于 2012-12-04T22:38:58.007 に答える