【问题标题】:How to build a python package into an exe如何将python包构建成exe
【发布时间】:2012-04-05 16:58:32
【问题描述】:

我已经用 python 编写了我的程序。它是跨七个文件编写的,在其中三个文件中我导入了一个自定义包。问题是我无法将我的程序构建成 exe。我试过 pyinstaller 1.5.1 和 py2exe。我已经按照我能找到的所有教程进行操作,但没有成功。每次我尝试运行创建的 exe 时,我都会收到一条错误消息,说它找不到我的自定义包。我想我只是无法将完整的包构建到 exe 中。请帮忙。

from distutils.core import setup
import py2exe, sys, os
sys.argv.append('py2exe')

mfcfiles = [os.path.join(mfcdir, i) for i in ["mfc90.dll", "mfc90u.dll", "mfcm90.dll", "mfcm90u.dll", "Microsoft.VC90.MFC.manifest"]]

data_files = [("Microsoft.VC90.MFC", mfcfiles),]

setup(
    data_files = data_files,
    options = {'py2exe': {'optimize': 2}},
    windows = [{'script': "LoadFilesGUI.py"}],
    zipfile = "shared.lib",
)

另一个:

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'optimize': 2}},
    windows = [{'script': "LoadFilesGUI.py"}],
    zipfile = None,
    console=['LoadFilesGUI.py'],
)

【问题讨论】:

  • 你可以做到。再试一次。当您这样做时,请告诉我们有关您尝试的文件结构和打包程序配置的更多详细信息。
  • 是的,它应该能够工作。我同意您需要向我们展示您的 setup.py 以及您的项目结构是什么样的
  • 什么类型的文件?什么类型的定制包? pyinstaller 和 py2exe 的错误是什么?问题为其他问题留出了更多空间!
  • 我的文件都是python文件。这三个只是用于gui的。错误显示“ImportEttor:没有名为 MyPackage 的模块”。 MyPackage 是我要调用的文件包。
  • @tovmeod:因为它仍然有效。您是根据 sourceforge 上最后一个 zip 的日期确定的吗?如果您查看实际存储库,您会看到它在过去 2 个月内被提交:py2exe.svn.sourceforge.net/viewvc/py2exe

标签: python py2exe pyinstaller


【解决方案1】:

通过“自定义包”,我假设您的意思是构成您的应用程序的自定义 python 模块。我可能会建议尝试使用 setup() 调用的“includes”选项来手动指定应该包含的 python 模块,以防它们未被自动发现:

setup( 
    windows = [{'script': "LoadFilesGUI.py"}], 
    data_files = data_files, 
    zipfile = None, 
    options = {
        'py2exe': {
            'optimize': 2, 
            'bundle_files': 1,
            'includes' : [],
        }
    }, 
) 

例如,在我使用 PyQt4 的项目中,我的包含如下所示:

options={ 
    "py2exe": { 
        "includes" : ['sip','PyQt4.QtCore','PyQt4.QtGui',
                        'PyQt4.QtNetwork','PyQt4.QtWebKit'] 
    } 
}

你的 setup.py 脚本的其余部分似乎很标准。确保您包含的模块是您的 PYTHONPATH 的一部分,或者与您的项目相关,或者明确添加到路径中。

如果正如您在 cmets 中所述,MyPackage 是您项目中的一个包,那么您会想要:'includes' : ['MyPackage']

如果这仍然给您带来错误,那么问题可能出在您的项目和包的结构上,或者再次出在您的 PYTHONPATH 上

【讨论】:

    【解决方案2】:

    cx_freeze 就是答案。

    根据我的经验是最可靠的选择。 有时它会遗漏一些依赖项,但您可以在发现缺少的内容后轻松手动添加。

    【讨论】:

    • 在这种情况下,它并不是真正的答案。只是你建议他使用另一个包。我已经在 Windows 上成功地使用了 py2exe,用于基于 PyQt4 的 python 项目。肯定是 OP 做错了什么。
    • 不管你说什么,但 cx_Freeze 通常从二进制包中工作 OOB,是跨平台的,并且可以从 Python 2.3 到 3.2,而据我所知,py2exe 仅适用于 Python 2.6。此外,自定义 distutils 脚本为您提供了很大的灵活性(请参阅cx-freeze.sourceforge.net/cx_Freeze.html)。继续尝试使用 py2exe 是免费的,但如果有更好的工具,为什么不使用它呢?
    • PS:这是一个简短的教程:blog.pythonlibrary.org/2010/08/12/…
    • 你似乎在提出奇怪和不知情的说法。 py2exe 不绑定到 python2.6,它是一个 distutils 扩展。我在此评论中的观点是,您的回答并不能仅仅通过说放弃他当前的尝试并尝试其他工具来帮助 OP。他很容易遇到 cx_freeze 的问题。正确的答案是帮助 OP 解决他提出的问题的答案。不幸的是,他没有向任何人提供足够的信息来这样做。
    • 对不起,我忘了在设置代码中包含(我到底是怎么做到的?)。现在将包括它。从我在线阅读的内容来看,py2exe 最好使用 2.6 和 2.7,但最多可以使用 3。
    猜你喜欢
    • 2011-11-28
    • 2021-09-25
    • 2017-01-12
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多