12

私は PyInstaller を以前に一度だけ使用したことがありますが、wxPython では非常に簡単に機能しました。私は現在、別のプロジェクトを構築しようとしています。コマンドラインから実行すると、プロジェクトはうまく機能します。ただし、ビルド後、メイン ウィンドウ (wxPython) が起動することはありません。

ビルド仕様でデバッグ フラグとコンソール フラグを True に設定しました。[('v', '', 'OPTION')]PyInstaller マニュアルで指定されているように、冗長オプション ( ) も追加しました。仕様は次のとおりです。

# -*- モード: python -*-
# basedir = os.path.realpath(os.path.dirname(__file__))
basedir = os.getcwd()

# アイコンをビルドします。
icons_toc = []
os.walk(os.path.join(basedir, 'icons')) のディレクトリの場合:
    dir[2] のアイコンの場合:
        icons_toc.append(
            (
                os.path.join('アイコン', アイコン),
                os.path.join(dir[0], アイコン),
                'データ'、
            )
        )

a = 分析(
    ['application.py'],
    pathex=['.', './lib', '../broadpy/lib', '../broadpy/vendor'],
    hiddenimports=[],
    hookspath=なし
)
a.datas += icons_toc

pyz = PYZ(純粋)

exe = EXE(
    ピズ、
    a.scripts + [('v', '', 'OPTION')],
    a.バイナリ、
    a.zipファイル、
    a.データ、
    name=os.path.join(
        「dist」、「アドレスクリーナー.exe」
    )、
    デバッグ=真、
    ストリップ=なし、
    upx=真、
    コンソール=True
)

アプリ = バンドル(
    EXE、
    name=os.path.join('dist', 'Addresscleaner.app')
)

ビルドした実行可能ファイルを実行すると、次の出力が得られます。

C:\Users\tomas\Dropbox\Broadnet\address_cleaner>"C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Addresscleaner.exe"
_MEIPASS2 は NULL です
アーカイブ名は C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Addresscleaner.exe です。
バイナリの抽出
子を実行する設定で自己を子として実行する
子プロセスの作成
子プロセスの終了を待っています...
_MEIPASS2 は C:/Users/tomas/AppData/Local/Temp/_MEI30762/ です
アーカイブ名は C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Addresscleaner.exe です。
すでに子供の中にいる - 走っている!
マニフェストパス: C:/Users/tomas/AppData/Local/Temp/_MEI30762/Addresscleaner.exe.manifest
アクティベーション コンテキストが作成されました
アクティブ化コンテキストがアクティブ化されました
C:/Users/tomas/AppData/Local/Temp/_MEI30762/python27.dll
環境操作
PYTHONPATH=C:/Users/tomas/AppData/Local/Temp/_MEI30762;C:/Users/tomas/Dropbox/Broadnet/address_cleaner/dist
PYTHONHOME=C:/Users/tomas/AppData/Local/Temp/_MEI30762/
v
# zipimport フックのインストール
import zipimport # ビルトイン
# zipimport フックをインストール
CArchive からのモジュールのインポート
import marshal # ビルトイン
抽出した
import imp # ビルトイン
import nt # ビルトイン
抽出された構造体
import _struct # ビルトイン
抽出されたアーカイブ
インポートフックのインストール
out00-PYZ.pyz
スクリプトの実行
import zlib # ビルトイン
import errno # ビルトイン
import _weakref # ビルトイン
import _codecs # ビルトイン
import _sre # ビルトイン
import _collections #ビルトイン
import operator # ビルトイン
import itertools # ビルトイン
import _bisect # ビルトイン
import _heapq # ビルトイン
インポート スレッド # ビルトイン
import math # ビルトイン
import binascii # ビルトイン
import _hashlib # C:\Users\tomas\AppData\Local\Temp\_MEI30762\_hashlib.pyd から動的にロード
import _random #ビルトイン
import cStringIO # ビルトイン
トレースバック (最新の呼び出しが最後):
  ファイル ""、65 行目、
  importHook のファイル「C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py」、386 行目
  doimport のファイル「C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py」の 480 行目
  ファイル「C:\Users\tomas\Dropbox\Broadnet\address_cleaner\build\pyi.win32\buildspec\out00-PYZ.pyz\win32com」の 5 行目
  importHook のファイル「C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py」、386 行目
  doimport のファイル「C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py」の 459 行目
  getmod のファイル「C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py」の 248 行目
  getmod のファイル「C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py」の 105 行目
ImportError: DLL の読み込みに失敗しました: 指定されたモジュールが見つかりませんでした。
RC: pyi_rth_win32comgenpy から -1
わかった。
アクティベーション コンテキストの非アクティブ化
アクティベーション コンテキストの解放
終わり
# __ビルトイン__._をクリア
# sys.path をクリア
# sys.argv をクリア
# sys.ps1 をクリア
# sys.ps2 をクリア
# sys.exitfunc をクリア
# sys.exc_type をクリア
# sys.exc_value をクリア
# sys.exc_traceback をクリア
# sys.last_type をクリア
# sys.last_value をクリア
# sys.last_traceback をクリア
# sys.path_hooks をクリア
# sys.path_importer_cache をクリア
# sys.meta_path をクリア
# sys.flags をクリア
# sys.float_info をクリア
# sys.stdin を復元
# sys.stdout を復元
# sys.stderr を復元
# クリーンアップ __main__
# cleanup[1] cStringIO
# クリーンアップ[1] __未来__
# クリーンアップ[1] _collections
# クリーンアップ[1] エンコーディング
# クリーンアップ[1] サイト
# クリーンアップ[1] atexit
# cleanup[1] shutil
# クリーンアップ[1] _heapq
# クリーンアップ[1] _weakref
# クリーンアップ[1] abc
# クリーンアップ[1] _bisect
# クリーンアップ[1] _weakrefset
# cleanup[1] 一時ファイル
# クリーンアップ[1] binascii
# cleanup[1] sre_constants
# クリーンアップ[1] コレクション
# クリーンアップ[1] _codecs
# cleanup[1] _warnings
# クリーンアップ[1] 数学
# cleanup[1] 演算子
# cleanup[1] fnmatch
# cleanup[1] コーデック
# クリーンアップ[1] re
# クリーンアップ[1] _struct
# クリーンアップ [1] スレッド
# cleanup[1] キーワード
# cleanup[1] シグナル
# クリーンアップ[1] ランダム
# クリーンアップ[1] itertools
# cleanup[1] encodings.aliases
# クリーンアップ[1] 例外
# cleanup[1] heapq
# クリーンアップ[1] sre_compile
# クリーンアップ[1] _sre
# クリーンアップ[1] _random
# クリーンアップ[1] ハッシュライブラリ
# クリーンアップ[1] 二分
# クリーンアップ[1] sre_parse
# クリーンアップ[1] _hashlib
# cleanup[2] copy_reg
# クリーンアップ[2] iu
# cleanup[2] os.path
# クリーンアップ[2] アーカイブ
# cleanup[2] 構造体
# クリーンアップ[2] errno
# クリーンアップ[2] インプ
# クリーンアップ[2] _abcoll
# cleanup[2] ntpath
# クリーンアップ [2] nt
# cleanup[2] ジェネリックパス
# クリーンアップ[2] 統計
# クリーンアップ[2] zipimport
# クリーンアップ[2] 警告
# cleanup[2] UserDict
# クリーンアップ[2] タイプ
# クリーンアップ[2] zlib
# cleanup[2] ラインキャッシュ
# クリーンアップ[2] os
# クリーンアップ[2] マーシャル
# システムのクリーンアップ
# クリーンアップ __builtin__
# クリーンアップ整数: 41 個の解放されていない整数
# クリーンアップフロート: 31 個の解放されていないフロート
親に戻る...
C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Addresscleaner.exe の解放ステータス

そのため、iu.py から例外が発生したことがわかりましたが、その理由はまだわかりません。また、Downloads/py-installer フォルダーを削除しても、そのフォルダー内の python ファイルが実行されるのは非常に不思議です。

要約すると、起動時にアプリケーションがクラッシュする理由を正確に把握するには、どのような手順を実行する必要がありますか?


Windows 8でPython 2.7.3でPyInstaller 2.0を使用しています。別のプロジェクトを正常に構築しているため、これらの事実だけでこのエラーが発生することはありません。

4

2 に答える 2

6

Pyinstaller では、依存関係を正しくパッケージ化するために、.spec ファイルで明示的な参照が必要になる場合があります

詳細については、pyinstaller が認識できるように適切なインポート ステートメントを確認するを参照してください

たとえば、重要な依存関係が Python モジュールの外部からインポートされた場合 (たとえば、pyinstaller が読み取らない jar または c++ ファイルから)、重要な依存関係を見逃すのは非常に簡単です。

依存関係ウォーカーは、欠落している DLL を体系的に追跡するための最初の防衛線になる可能性があります。単純にダウンロードしてから、exe または関連する dll をロードして、どの依存関係が欠落しているかを確認します。次に、それらを追跡し、.exe とともにディレクトリに手動で追加するのは、野生のガチョウの追跡です ( 1 つのディレクトリにパッケージ化されていると仮定します)。

補足として、pyinstaller 2.1(python 2.7.6)の場合、pyi_importers.pyファイルを変更して、インポート時にどのモジュールがトラブルメーカーであったかを少なくとも試して印刷しました。

# line 409 of Pyinstaller.loader.pyi_importers.py
try: module = imp.load_module(fullname, fp, filename, self._c_ext_tuple)
except Exception as e:
    print fullname # at least tells you what module couldn't be imported
    raise e

次に、問題が発生した場所がわかれば、依存関係ウォーカーを使用して問題を特定し、欠落している DLL を根絶することができます。

于 2014-06-05T17:19:17.800 に答える
2

この回答は、このような問題をデバッグする方法に答えていないことを知っているので、正しいとはマークしませんが、アプリケーションを構築することができたので、その方法を共有する必要があると考えました. 私は 3 つのことを行いましたが、それぞれがエラーの原因である可能性がありますが、わかりません。

于 2012-12-09T15:50:55.957 に答える