将python代码编译成单个exe


问题内容

我一直试图将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)的用户无法运行它。没有给出任何错误,它只是不会启动。我已经通过将其发送给几个朋友来进行尝试,并且还在虚拟机上进行了尝试。

  1. 尝试过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

我真的希望这对可能的答案有所帮助。


问题答案:

我的两分钱:您是否使用的debug选项进行了测试PyInstaller

只需更新您的specfile:

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函数中的附加功能。