4

Python コードを単一の exe にコンパイルしようとしてきましたが、正しく実行できませんでした。

  1. 私はpyinstallerを試しました.これは.specファイルです:

    # -*- mode: python -*-
    a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'programs\\toolbox.py'],
             pathex=['C:\\Users\\Ronaldo\\Desktop\\Python\\pyinstaller'])
    pyz = PYZ(a.pure)
    exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'program.exe'),
          debug=False,
          strip=False,
          upx=True,
          console=False )
    

    Pyinstaller は正常にコンパイルされ、機能する単一の exe ファイルを作成しましたが、同じバージョンの Python (2.7.2) がインストールされていない他のユーザーは実行できなかったようです。エラーは発生しません。単に起動しません。数人の友人に送信して試してみました。また、仮想マシンでも試しました。

  2. py2exeを試しました。コンパイルに関しては(すべてのライブラリが隣にあり、残りのファイルがある場合)、正常に動作します。単一のファイルにコンパイルしようとしましたが、コンパイルされたexeファイルで「toolbox.exeが動作を停止しました」というエラーが発生しました。念のため、エラーレポートを次に示します。

    Problem signature:
      Problem Event Name:   APPCRASH
      Application Name: toolbox.exe
      Application Version:  0.0.0.0
      Application Timestamp:    49180193
      Fault Module Name:    StackHash_0a9e
      Fault Module Version: 0.0.0.0
      Fault Module Timestamp:   00000000
      Exception Code:   c0000005
      Exception Offset: 01b61fcb
      OS Version:   6.1.7601.2.1.0.256.1
      Locale ID:    1033
      Additional Information 1: 0a9e
      Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
      Additional Information 3: 0a9e
      Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
    

    setup.py ファイルは次のとおりです。

    from distutils.core import setup
    import py2exe, sys, os
    
    sys.argv.append('py2exe')
    
    setup(
        options = {'py2exe': {'bundle_files': 1}},
        windows = [{'script': "toolbox.py"}],
        zipfile = None,
    ) single.py file:
    

    そして、ここにsingle.pyがあります:

    import os, sys, ctypes
    
    ctypes.windll.user32.MessageBoxA(0,
        "curdir: %s\nexedir: %s\nsys.winver: %s" % (
            os.path.abspath(os.curdir),
            os.path.abspath(os.path.dirname(sys.argv[0])),
            sys.winver,
        ), "%s - Message" % os.path.basename(sys.executable), 0x30
    )
    

私が書いたプログラムは、tkinter、sys、random、および win32clipboard(pywin) モジュールを使用しています。私は何を間違っていますか?他に優れたコンパイラはありますか?

更新: Joël のヒントにより、デバッグとコンソール モードでコンパイルしました。Python 2.7 を持っていないユーザーにはまだ機能しませんでした。これはエラーメッセージです:

C:\Users\XXXXX\Desktop>program.exe
Found embedded PKG: C:\Users\XXXXX\Desktop\program.exe
Extracting binaries
Setting up to run child
Setting magic environment var
Creating child process
Waiting for child process to finish...
Found embedded PKG: C:\Users\XXXXX\Desktop\program.exe
workpath: C:/Users/XXXXX/AppData/Local/Temp/_MEI14042/
manifestpath: C:/Users/XXXXX/AppData/Local/Temp/_MEI14042/program.exe.manifest
Activation context created
Activation context activated
C:\Users\XXXXX\AppData\Local\Temp\_MEI14042\python27.dll
Manipulating evironment
PYTHONPATH=C:/Users/XXXXX/AppData/Local/Temp/_MEI14042;C:/Users/XXXXX/Desktop
importing modules from CArchive
extracted iu
extracted struct
extracted archive
Installing import hooks
outPYZ1.pyz

これが可能な答えの助けになることを本当に願っています。

4

1 に答える 1

2

debug私の 2 セント: のオプションを使用してテストを行いましたPyInstallerか?

スペックファイルを更新するだけです:

exe = EXE( pyz,
           [...]
           debug=True,
           [...])

(注: 多数のメッセージ ボックスを回避するために、コンソール出力を設定することをお勧めします: console=True)

多分それはいくつかの有用なデータを返すでしょう。この場合、出力を提供してください (存在する場合)。


取得した出力によると、これは非常に一般的な問題です。PyInstaller がモジュールの依存関係を解決すると、依存関係の依存関係が忘れられる可能性があるためです。

あなたの場合、Tclが欠落しており、これはいくつかのTkinterライブラリで必要です: ここを見てください: Python、Pyinstaller、Windows でショートカットを作成する

ドキュメントによると:

Makespec.py について詳しく説明すると、これはサポートされているコマンド ラインです: python Makespec.py [opts] [ ...] 使用できるオプションは次のとおりです。

[...]

-K, --tk デプロイメントに TCL/TK を含めます。

この引数を試して、specファイルへの影響を確認してください。これは、Analysis または EXE 関数で考慮されるモジュールの追加に違いありません。

于 2011-10-26T13:29:59.103 に答える