2011-10-24 66 views
4

我一直在试图将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)无法运行它。不会给出任何错误,它根本不会启动。我已经通过将 发送给几个朋友来尝试它,并且也尝试在虚拟机上尝试。

  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 

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

+1

“无法运行它” - 你得到什么错误? –

+0

你使用任何大的第三方库?值得注意的是,Tkinter需要一个特殊的标志来与pyinstaller – Shish

+0

@PetrViktorin Viktorin一起工作没有任何错误。它只是不运行。 – Thurax

回答

2

我的两分钱:你是否使用PyInstallerdebug选项进行测试?

只需更新您的spec文件:

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

(注:为了避免大量的消息框,您可能要设置控制台输出:console=True

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


根据你得到的输出,这是一个相当普遍的问题,因为如果PyInstaller解决依赖于你的模块,依赖的依赖性可能会被遗忘。

在你的情况,Tcl丢失,这是由一些Tkinter库需要:你应该到这里看看:Python, Pyinstaller creating shortcuts in windows

根据文档:

在阐述Makespec.py,这是支持的命令行:蟒蛇Makespec.py [OPTS] [...]如果允许的选项:

[...]

-K, - -tk在部署中包含TCL/TK。

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

+0

我这样做了,它仍然没有在没有安装python的计算机上运行。这是我得到的错误: http://pastebin.com/fg5JuhqR 我使用了调试模式,也是“console = True” – Thurax

+0

这很有用;我相应地更新了我的答案。 –