代码之家  ›  专栏  ›  技术社区  ›  Charles Anderson

PY2Exe无法生成可执行文件

  •  51
  • Charles Anderson  · 技术社区  · 16 年前

    我在XP上使用的是python 2.6。我刚刚安装了py2exe,我可以从hello.py成功创建一个简单的hello.exe。但是,当我尝试在实际程序中使用py2exe时,py2exe会生成一些信息消息,但无法在dist文件夹中生成任何信息。

    my setup.py如下所示:

    from distutils.core import setup
    import py2exe
    
    setup(console=['ServerManager.py'])
    

    Py2Exe输出如下所示:

    python setup.py py2exe
    running py2exe
    creating C:\DevSource\Scripts\ServerManager\build
    creating C:\DevSource\Scripts\ServerManager\build\bdist.win32
       ...
       ...
    creating C:\DevSource\Scripts\ServerManager\dist
    *** searching for required modules ***
    *** parsing results ***
    creating python loader for extension 'wx._misc_' (C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_misc_.pyd -> wx._misc_.pyd)
    creating python loader for extension 'lxml.etree' (C:\Python26\lib\site-packages\lxml\etree.pyd -> lxml.etree.pyd)
       ...
       ...
    creating python loader for extension 'bz2' (C:\Python26\DLLs\bz2.pyd -> bz2.pyd)
    *** finding dlls needed ***
    

    Py2Exe似乎已经找到了我所有的导入内容(尽管我有点惊讶地看到win32被提到,因为我没有明确地导入它)。另外,我的程序使用以下命令启动时非常愉快:

    python ServerManager.py
    

    显然,我做了一些根本错误的事情,但是在没有任何来自Py2Exe的错误消息的情况下,我不知道是什么。

    11 回复  |  直到 10 年前
        1
  •  41
  •   bill    16 年前

    我把它放在所有setup.py脚本中:

    distutils.core.setup(
        options = {
            "py2exe": {
                "dll_excludes": ["MSVCP90.dll"]
            }
        },
        ...
    )
    

    这样可以使py2exe保持安静,但您仍然需要确保dll在用户的计算机上。

        2
  •  40
  •   tovmeod ComputerFellow    13 年前

    我发现,如果我注释掉程序中使用wxpython的部分,那么py2exe就可以正常工作。此外,当我对下载的“简单”示例(即在python26\lib\site packages\py2exe\samples\simple中)使用py2exe时,我会收到以下错误消息:

    *** finding dlls needed ***
    error: MSVCP90.dll: No such file or directory
    

    所以关于wxpython的一些东西使py2exe认为我需要一个Visual Studio 2008 DLL。我没有VS2008,但是我的程序和Python模块的目录一样工作得很好。我在网上找到了msvcp90.dll的副本,将其安装在python26/dlls中,py2exe现在可以正常工作了。

    我仍然不理解这种依赖性来自何处,因为我可以在没有py2exe的情况下完美地运行代码。Py2Exe没有像对test_wx.py示例那样给我一条错误消息,这也很烦人。

    进一步更新:当我试图在另一台PC上运行Py2EXE的输出时,我发现它需要安装MSVCR90.DLL;所以如果您的目标PC还没有安装VisualC++ 2008,我建议您下载并安装 Microsoft Visual C++ 2008 Redistributable Package .

        3
  •  9
  •   Mike Driscoll    14 年前

    Wxpython与此无关。在python 2.6之前,python使用Visual Studio 2003作为其Windows编译器。从2.6开始,他们转向了Visual Studio 2008,在某些情况下需要清单文件。这已经被很好地记录下来了。请参见以下链接:

    http://wiki.wxpython.org/py2exe

    http://py2exe.org/index.cgi/Tutorial#Step52

    另外,如果您使用py2exe创建一个wxpython应用程序,那么您需要设置windows参数,而不是控制台参数。也许我的教程可以帮助你:

    http://www.blog.pythonlibrary.org/2010/07/31/a-py2exe-tutorial-build-a-binary-series/

        4
  •  6
  •   resplin    15 年前

    看起来这只是对Python2.6的依赖。在2.5下我没有得到这个错误,但是升级后我得到了。

    此电子邮件线程有一些问题存在的背景以及如何解决问题:
    http://www.nabble.com/py2exe,-Py26,-wxPython-and-dll-td20556399.html

    我不想安装vCredit。我的应用程序当前不需要安装,可以由非管理员运行,这是我不想失去的行为。因此,我按照链接中的建议,通过安装python“仅限此用户”,获得了必要的microsoft.vc90.crt.manifest和msvcr90.dll。我还需要msvcp90.dll,这是我在“所有用户”python 2.6安装的winsxs文件夹中找到的。因为我已经有了三个中的两个,所以我加入了msvcm90.dll来防止将来的错误,尽管我没有在遗漏时立即得到任何错误。我将清单和三个DLL放在冻结应用程序使用的libs文件夹中。

    我必须执行的技巧是在应用程序文件夹的根目录中包含清单和msvcr90.dll的附加副本,旁边是py2exe生成的可执行文件。此DLL副本用于引导应用程序,但它似乎只在libs文件夹中查找。

    希望这个发现能帮助其他人。

    另外,我在让py2exe记录真正的错误消息时也遇到了同样的问题。然后我意识到stderr没有被重定向到我的日志文件中。在调用py2exe的命令行上添加“>build.log 2>&1”。

        5
  •  6
  •   Littm JessicaParker    12 年前
    import sys
    
    sys.path.append('C:\\WINDOWS\\WinSxS\\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2')
    

    在每个窗口中,您都可以找到文件 MSVCP90.dll 在某些子目录中 C:\\WINDOWS\\WinSxS\\

    在我的例子中,目录是: x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2 .

    C:\\Windows\\WinSxs\\ 并使用Windows文件搜索查找 MSVCP90.DLL .

        6
  •  3
  •   george    15 年前

    只是为了你的信息,对我来说,复制文件很有效

    Microsoft.VC90.CRT.清单 MSVCR90.DLL

    进入用户计算机上的.exe目录(未安装python或vc可再发行软件)。

    谢谢你的提示!

        7
  •  1
  •   sli    16 年前

    输出显示您正在使用WX。尝试运行py2exe,并将脚本指定为GUI应用程序,而不是控制台。如果我没弄错的话,那会导致Py2Exe出现问题。

        8
  •  1
  •   bazzinga    12 年前
        9
  •  -1
  •   Werner    10 年前
        10
  •  -1
  •   petitchamp    10 年前

    在我的win8.1中,我找不到路径

    C:/程序文件/Microsoft Visual Studio 9.0/vc/redist/x86/microsoft.vc90.crt

    相反,在

    c:/windows/winxs/x86_microsoft.vc90.crt_xxxxx

    XXX可能因您的电脑而异。

    可以在路径中搜索,然后在setup.py中添加路径。

    import sys
    sys.path.append('C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX')
    
        11
  •  -2
  •   umläute    10 年前
    import sys
    
    sys.path.append('c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT')