使用 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/
我正在尝试使用 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/