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选项进行了测试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文件的影响。我敢打赌,这是在分析或 EXE 函数中考虑的模块中的一个补充。

于 2011-10-26T13:29:59.103 回答