导入matplotlib的python脚本成功但脚本的冻结二进制文件失败
Posted
技术标签:
【中文标题】导入matplotlib的python脚本成功但脚本的冻结二进制文件失败【英文标题】:python script that imports matplotlib succeeds butfrozen binary of script fails 【发布时间】:2016-12-21 04:49:51 【问题描述】:我的脚本需要导入 numpy
、sklearn
和 matplotlib
,但我无法安装 sklearn。对我的问题 http://https://***.com/questions/38733220/difference-between-scikit-learn-and-sklearn 的一个非常有用的回复解释说我需要重新安装 numpy。使用 pip 更新 numpy 失败,因为 OS X 10.11 SIP 阻止卸载当前的 numpy。 mfripp http://https://apple.stackexchange.com/questions/209572/how-to-use-pip-after-the-os-x-el-capitan-upgrade 对有关 pip 和 SIP 的问题的非常有用的回答为该问题提供了详细的解决方案。我完全按照这些说明使用pip
为所有用户重新安装numpy
、matplotlib
、scipy
和sklearn
。
当我使用命令运行完成的脚本时
python DistMatPlot.py Random10A.matrix Random10A.pdf
脚本运行完美,写入了所有预期的输出文件。
但是,我总是看到:
"/Library/Python/2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib 正在使用 fc-list 构建字体缓存。这 可能需要一点时间。 warnings.warn('Matplotlib 正在构建字体 使用 fc-list 缓存。这可能需要一点时间。')"
在更新 numpy、matplotlib 等之前,我从未见过其他 matplotlib 脚本。2 秒的延迟只是有点烦人。
我使用 pyinstaller 编译了一个冻结的二进制文件,在编译过程中我收到了几条类似于上面的消息。 生成的冻结二进制文件运行失败,命令如下:
./DistMatPlot Random10A.matrix Random10A.pdf
产生了以下内容:
/var/folders/8x/7_zp_33h8xj6td0059b72p9h0000gp/T/_MEIhIysTV/matplotlib/font_manager.py:273: UserWarning: Matplotlib 正在使用 fc-list 构建字体缓存。这 可能需要一点时间。 Traceback(最近一次调用最后一次):文件 “”,第 13 行,在文件中 "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", 第 389 行,在 load_module 中 exec(bytecode, module.dict) 文件“matplotlib/pyplot.py”,第 114 行,文件“matplotlib/backends/init.py”,行 32、在pylab_setup文件中 "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", 第 389 行,在 load_module 中 exec(bytecode, module.dict) 文件“matplotlib/backends/backend_macosx.py”,第 24 行,在文件中 "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", 第 546 行,在 load_module 中 module = imp.load_module(fullname, fp, filename, ext_tuple) RuntimeError: Python 没有作为框架安装。 Mac OS X 如果没有 Python,后端将无法正常运行 作为框架安装。有关更多信息,请参阅 Python 文档 有关在 Mac OS X 上安装 Python 作为框架的信息。请 要么将 Python 重新安装为框架,要么尝试其中一个 后端。如果您在虚拟环境中使用 Matplotlib 请参阅“在虚拟环境中使用 Matplotlib” Matplotlib 常见问题 DistMatPlot 返回 -1
我查看了类似的问题并尝试了他们建议的解决方案,但无济于事。
(1) 为什么matplotlib每次运行都需要重建一个字体缓存?
(2) 为什么脚本本身成功时冻结的二进制文件会失败?运行 pyinstaller 时是否需要除 -F 之外的其他选项?
【问题讨论】:
您是否考虑过使用anaconda,它可以更轻松地安装常用软件(提供二进制文件)?由于我不是 OS X 用户,我无法在此提供其他提示,但我观察到与 Linux 相比,OS X 上有许多安装/编译问题(关于需要 C++、Fortran 等的复杂软件)。关于 matplotlib:它只做一次字体缓存! “为什么 matplotlib 每次运行时都需要重建字体缓存”,你有没有得到任何解决方案? 【参考方案1】:冻结二进制文件的问题原来是“RuntimeError: Python is not installed as a framework.”
一些帖子讨论了这个问题,并建议在“import matplotlib.pyplot as plt”之前添加这两行:
导入 matplotlib matplotlib.use('TkAgg')
这不起作用,但这个轻微的修改确实起作用了: 导入 matplotlib matplotlib.use('Agg')
我怀疑“Agg”可能特定于 OS X 或 OS X 10.11 中包含的 python 版本
【讨论】:
【参考方案2】:Pyinstaller 在编译某些脚本时可能会出现问题,尤其是在使用 scipy 或 matplotlib 模块时。编译看似成功,但编译后的脚本可能无法执行。如果错误消息表明找不到模块,例如 scipy.stats,请尝试使用 hiddenimport 选项进行编译: pyinstaller -F --hiddenimport=scipy.stats --hiddenimport=_sysconfigdata GrowthRates.py
在编译使用 scipy 或 matplotlib 的脚本时,Anaconda python 有很大帮助: OSX:python27Env Windows:使用 Anaconda python Linux:使用 Anaconda python
【讨论】:
以上是关于导入matplotlib的python脚本成功但脚本的冻结二进制文件失败的主要内容,如果未能解决你的问题,请参考以下文章
由于导入,在使用 qt4agg 运行 matplotlib 后关闭时 Python 脚本崩溃
导入 matplotlib.pyplot 时嵌入式 python 崩溃