将python代码编译为单个exe

时间:2011-10-24 17:34:15

标签: python compilation py2exe python-2.7 pyinstaller

我一直在尝试将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
    )
    
  3. 我编写的程序使用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
    

    我真的希望这可以作为对可能答案的帮助。

1 个答案:

答案 0 :(得分:2)

我的两分钱:您是否使用debug的{​​{1}}选项进行了测试?

只需更新您的specfile:

PyInstaller

(注意:为了避免使用大量的消息框,您可能需要设置控制台输出:exe = EXE( pyz, [...] debug=True, [...])

也许它会返回一些有用的数据。在这种情况下,请提供输出(如果有的话)。


根据您得到的输出,这是一个非常常见的问题,因为如果PyInstaller解析了模块的依赖关系,可能会忘记依赖关系的依赖关系。

在您的情况下,console=True丢失了,某些Tcl库需要这样做:您应该看看这里:Python, Pyinstaller creating shortcuts in windows

根据文件:

  

详细说明Makespec.py,这是支持的命令行:python Makespec.py [opts] [...]允许的选项是:

     

[...]

     

-K, - tk包括部署中的TCL / TK。

您可以尝试使用此参数,并检查对Tkinter文件的影响。我敢打赌,这是在分析或EXE功能中考虑的模块中的一个补充。