1

我正在尝试使用 PyInstaller(单文件模式)创建一个 exe 文件。我的程序是单个文件(usingTry.py)。这是一个超级简单的文件,它从我创建的 egg 文件中实例化了一个名为“TrySystem”的类。“TrySystem”类加载一个 XRC 文件并使用 wxPython 在其中放置一个位图按钮。XRC 和图像文件保存为内部 Egg 资源,如管理 Python 项目中的资源中所述

我在 mac (10.8.5) 上准备我的鸡蛋:

sudo python setup.py bdist_egg

然后我将它复制到一台 winXP 机器上(实际上它与 VM 在同一个计算机上运行)并安装它:

easy_install Try\try2\dist\try3-1.0-py2.7.egg

然后,当我尝试从 python 终端(在 WinXP 上)运行“python usingTry.py”时,一切正常,我看到了框架和按钮。然后我继续从“usingTry.py”(在 WinXP 上)准备一个 exe 文件:

Try\users\usingTry>pyinstaller.py -F usingTry.py

然后我尝试运行它:

Try\users\usingTry>dist\usingTry.exe

Traceback (most recent call last):
  File "<string>", line 11, in <module>
  File "<string>", line 4, in __init__
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\try3", line 35, in __init__
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\try3", line 8, in __init__
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\wx._core", line 7981, in __init__
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\wx._core", line 7555, in _BootstrapApp
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\try3", line 14, in OnInit
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\pkg_resources", line 868, in resource_filename
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\pkg_resources", line 181, in get_provider
  File "c:\programs\pyinstaller-2.0\PyInstaller\loader\iu.py", line 409, in importHook
    raise ImportError("No module named %s" % fqname)
ImportError: No module named try3.resources

有人知道如何解决这个问题吗?在此链接中是一个包含所有内容的 zip 文件:

try.zip:
    Try/
        try2/                           (this is the code that creates the egg)
            setup.py
            ez_setup.py
            try3/                       (the egg's code)
                __init__.py
                resources/              (here are the resource files used in the egg)
                    __init__.py
                    main.xrc
                    stopButton.png
            build/   
                ...                     (files created while I built the egg)
            dist/
                try3-1.0-py2.7.egg      (the prepared egg file)
            try3.egg-info/
                ...
        users/
            usingTry/                   (here is the code that uses the egg file)
                usingTry.py
                usingTry.spec
                dist/                   
                    usingTry.exe        (created by "pyinstaller -F usingTry.py")                   
                    try3/               (I manually copied it here from Try/try2/ so the exe file works)
                build/                  (created by PyInstaller)
                    ...
                logdict2.7.5.final.0-1  (created by PyInstaller)

您会注意到文件夹 Try\try2\try3(包含 egg 的代码)被手动复制到创建的 exe 文件所在的位置(Try\users\usingTry\dist)。那是因为它使 exe 文件工作。我在 PyInstaller 生成的 exe 中发现此解决方法不起作用,项目使用 ReportLab

我想做的是避免这种解决方法,并且事情会简单地起作用。它必须非常简单,因为它在 PyInstaller 网站上声明他们完全支持使用 egg 文件。

4

1 回答 1

0

我认为这里的问题是,当您使用 easy_install 安装它时,它可能没有作为压缩鸡蛋安装。我在 Linux 系统上试过这个,结果就是这样。

如果这样做easy_install --record INSTALLED_FILES.txt try3-1.0-py2.7.egg,您将在INSTALLED_FILES.txt.

如果列出的文件不在压缩鸡蛋中,则发生的情况是 PyInstaller 检测到您想要import try3,在您PYTHONPATH的解压缩鸡蛋中找到它,并以自己的格式包含它,而不是鸡蛋。因此pkg_resources在鸡蛋或“物理”文件中找不到它,它会中断。

您可能可以做的是:

  • 尝试使用pip或将其安装为带拉链的鸡蛋easy_install(我怀疑 pip 会这样做)
  • 将您的鸡蛋运送到外部,然后将其放入./eggs,然后从您的脚本中修改 Python 路径以包含所有鸡蛋。(import glob, sys, os; sys.path.extend(glob.glob(os.path.join(os.path.dirname(sys.executable), 'eggs', '*.egg')))可能是这样的)如果你想在运行时动态包含鸡蛋,你可能想要,我知道我做到了)
  • 从规范文件中,明确地包含鸡蛋。但是你必须确保另一个try3没有被捡起,也许会有冲突。所以将鸡蛋添加到 中pathex=[..., '/full/path/to/try3-1.0-py2.7.egg',这样它将直接使用鸡蛋,并且可能直接从中打包。
  • 最后,您可以将这些数据文件添加到Analysis的数据列表中,它会将它们提取到可执行文件的目录中。这就是我之前所做的。

对不起,如果我真的迟到了:) 希望它有所帮助。

编辑哦,如果您查看.toc构建目录中的文件,它可能会帮助您调试。只需 Ctrl+Ftry3usingTry,您可能会找到有关包含(或不包含)内容的有用信息。

于 2014-01-13T23:41:51.017 回答