使用 PyInstaller 时出错

Error using PyInstaller

我正在尝试使用 PyInstaller 创建一个独立的 OSX 应用程序来运行我制作的 GUI。当我在终端中输入以下内容时:

pyinstaller gui.py

似乎一切正常,直到我收到以下错误:

File "/Users/username/anaconda/bin/PyInstaller", line 11, in <module>
    sys.exit(run())
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/__main__.py", line 90, in run
run_build(pyi_config, spec_file, **vars(args))
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/__main__.py", line 46, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/building/build_main.py", line 788, in main
build(specfile, kw.get('distpath'), kw.get('workpath'), 
kw.get('clean_build'))
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/building/build_main.py", line 734, in build
exec(text, spec_namespace)
File "<string>", line 16, in <module>
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/building/build_main.py", line 212, in __init__
self.__postinit__()
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/building/datastruct.py", line 178, in __postinit__
self.assemble()
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/building/build_main.py", line 470, in assemble
module_hook.post_graph()
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/building/imphook.py", line 409, in post_graph
self._load_hook_module()
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/building/imphook.py", line 376, in 
_load_hook_module
self.hook_module_name, self.hook_filename)
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/hooks/hook-PyQt4.py", line 33, in <module>
(qt_menu_nib_dir('PyQt4'), ''),
File "/Users/username/anaconda/lib/python2.7/site-
packages/PyInstaller/utils/hooks/qt.py", line 125, in qt_menu_nib_dir
""".format(namespace, path))

Exception: 
            Cannot find qt_menu.nib for PyQt4
            Path checked: 
   /Users/felipe/miniconda/envs/_build/lib/QtGui.framework/Resources/qt_menu.nib

这看起来很奇怪,因为我的名字不是 felipe!

我有几个问题:

1) 我的电脑上怎么会有felipe这个目录呢? (我是用anaconda安装qt的,不知道跟这个有关系吗?)

2) 在我收到错误消息之前,PyInstaller 正在寻找正确的文件夹。为什么它开始在我不知道的这个模糊的(对我来说是模糊的)目录中查找?

3) 我在目录方面是个新手,我在计算机上的任何地方都找不到 mister felipe。当我查看 Users 文件夹时,我只看到我自己的用户和一个空的 "Shared" 文件夹。 (我不知道共享文件夹的用途和原因。)

4) 根据网上的资料,我把qt_menu-nib复制到了应该独立的脚本所在的文件夹下。我应该怎么做才能从这里成功创建一个独立的?

首先,您面临 PyInstaller 和 Anaconda 之间的一个已知问题:PyInstaller issue #2135。对话包含您问题的答案。

1) 该路径被硬编码在 Anaconda 提供的错误构建的 Qt 二进制文件中,请参阅 comment from mrady3

2) PyInstaller 加载 Qt4-specific hook 以查找 运行 目标应用程序所需的资源 (qt_menu.nib)。挂钩代码尝试从 Qt 二进制文件本身获取资源目录的位置。 Qt 二进制 returns 错误的 /hardcoded/ 路径,然后该过程失败。

3) 见第 1) 点,它是维护者机器上的一个文件夹。 Qt 假定其安装路径在构建之前已经预先设置好; Anaconda 存储库托管一个二进制文件,该二进制文件是在考虑了另一个安装路径的情况下编译的。

4) 可能有几种可能的方法:

尝试从源安装 PyInstaller 的开发者版本,它有 some fixes for the above-mentioned issue。然后再次尝试构建应用程序:

git clone https://github.com/pyinstaller/pyinstaller.git
cd pyinstaller
/Users/username/anaconda/bin/python setup.py sdist
conda install dist/PyInstaller-3.3.dev0.tar.bz2

使用 homebrew 安装 Qt4。本地编译会耗时较长:

brew install cartr/qt4/qt
find /usr/local/Cellar/qt -name qt_menu.nib

编辑 /Users/username/anaconda/lib/python2.7/site- packages/PyInstaller/hooks/hook-PyQt4.py 处的 Qt4 挂钩,并将对 qt_menu_nib_dir('PyQt4') 的调用替换为来自自制程序安装的路径 ('/usr/local/Cellar/qt/4.8.7_3/lib/QtGui.framework/Versions/4/Resources/qt_menu.nib')。

或者,只需将 qt_menu.nib 放入预期位置:

sudo mkdir -p /Users/felipe/miniconda/envs/_build/lib/QtGui.framework/Resources/
sudo ln -s /usr/local/Cellar/qt/4.8.7_3/lib/QtGui.framework/Versions/4/Resources/qt_menu.nib /Users/felipe/miniconda/envs/_build/lib/QtGui.framework/Resources/