7

py2exeを使用して、作成したPythonアプリケーションを配布しようとしています。すべてうまくいくようですが、別のマシンで実行すると、次のエラーで失敗します。

Traceback (most recent call last):
  File "application.py", line 12, in <module>
  File "win32api.pyc", line 12, in <module>
  File "win32api.pyc", line 10, in __load
ImportError: DLL load failed: The specified procedure could not be found.

私はこれをグーグルで検索しましたが、あまり見つかりませんでしたが、次の提案を試しましたが無駄になりました。

win32apiの前にpywintypesとpythoncomをインポートしました(py2exeのsetup.pyとメインアプリケーション)setup.pyにコードを追加しました-

# ModuleFinder can't handle runtime changes to __path__, but win32com uses them
import pywintypes
import pythoncom
import win32api
try:
# if this doesn't work, try import modulefinder
    import py2exe.mf as modulefinder
    import win32com
    for p in win32com.__path__[1:]:
        modulefinder.AddPackagePath("win32com", p)
    for extra in ["win32com.shell"]: #,"win32com.mapi"
        __import__(extra)
        m = sys.modules[extra]
        for p in m.__path__[1:]:
            modulefinder.AddPackagePath(extra, p)
except ImportError:
    # no build path setup, no worries.
    pass

私はこれらすべてにまったく慣れていないので、どんな助けでも大歓迎です

ありがとう

ジョン

4

4 に答える 4

29

この問題は、パッケージが Vista でビルドされ、XP で実行されたときに見られました。問題は、py2exe が誤ってパッケージに追加powrprof.dllされたことであることが判明しました。mswsock.dllただし、Windows XP にはこれらのファイルの独自のコピーが含まれており、アプリと共にインストールされた Vista のファイルを読み込むことはできません。

optionsパッケージからそれらを削除するとうまくいきました。これをdictに追加することで簡単に行うことができますsetup.py

 'dll_excludes': [ "mswsock.dll", "powrprof.dll" ]
于 2009-12-30T14:28:00.970 に答える
2

@Wim、「setup.pyのオプション辞書にこれを追加する」ことについて少し混乱しました。私のように、セットアップへの既存の呼び出しに options 引数がなかった場合、これは物事をより明確にするかもしれません:

setup(name='myprog',     
      ...
      options={"py2exe":{"dll_excludes":[ "mswsock.dll", "powrprof.dll" ]}},
      ...
      )
于 2010-10-22T09:13:06.023 に答える
0

追加のコメントとして。Py2exe でプログラムを再構築するときは、古い "dist" ディレクトリを必ず削除してください。アプリが開発環境で動作し、本番環境で動作していない理由を理解できずに、3 時間以上座っていました。distを削除し、py2exeで再構築するとうまくいきました。

于 2012-03-07T10:25:24.297 に答える
0

オプション ディクショナリで、パッケージに win32api を追加してみてください。

次に例を示します。

excludes = ["pywin", "pywin.debugger"] # there will be more in real life...
options = dict(optimize=2,
           dist_dir="build",
           excludes=excludes,
           packages=["win32api"]) 
setup(
    name="MyCoolApp",
    options=dict(py2exe=options),
    # etc ...
于 2009-12-30T14:06:25.270 に答える