我正在运行 pyinstaller 3.3.dev0+gb78bfe5 (在撰写本文时是最新的)并看到一些奇怪的东西:当我运行应用程序的单目录版本时,我收到一条警告,指出 matplotlib 正在重建字体缓存,但没有当我直接在 python 中运行应用程序时。
通过打印 mpl.get_cachedir(),我看到 pyinstaller 构建的版本在 /var/folders/.... 中看到缓存目录(其基本名称每次运行都会更改) )而不是在 ~/.matplotlib 中。显然,路径每次变化的缓存并不是一个非常有用的优化...
当我直接在 python 中运行应用程序时,缓存目录是 ~/.matplotlib。如果我删除缓存,第一次运行应用程序(直接通过 python)时,我会收到消息,然后在后续运行中就不再收到消息了,如预期的那样。
我看到 TMPDIR (显然是自动)设置为 / var/folders/9t/31_qw25565vdmzbtdsdlnh340000gn/T/,它确实是(不断变化的)缓存目录的父级。令人费解的是为什么 matplotlib 在一种情况下使用它,而在另一种情况下使用标准缓存目录。 pyinstaller 构建是否会选择不同版本的 matplotlib,或者这是一个环境变量问题?或者 pyinstaller 特有的其他东西?
FWIW,我通过 Anaconda 在 Mac OS 10.10.5 (Yosemite) 和 python 2.7.11 上运行。
你遇到的问题是因为 PyInstaller 会打包应用程序并以一种认为
/var/folders/…
是一个合适的临时目录的方式隔离它。Matplotlib 使用
matplotlib.get_cachedir()
函数来找到字体缓存,而这个函数又依赖于
_get_configdir()
函数,后者优先使用
TMPDIR
环境变量(如果设置了)。
以下是解决此问题的步骤:
-
显式设置字体缓存目录:
在你的代码中,在导入 matplotlib 之前,使用
matplotlib.pyplot.rcParams
设置'cachedir'
参数到你想要使用的目录。这将覆盖默认行为。
python
import matplotlib as mpl
mpl.rcParams['cachedir'] = '/Users/<your_user>/.matplotlib'
import matplotlib.pyplot as plt
将
<your_user>
替换为你的实际用户名。
-
在
.spec
文件中设置环境变量: 在你的 PyInstaller.spec
文件中,你可以在Analysis
部分设置datas
选项,以包含你的字体缓存目录。
python
a = Analysis(['your_script.py'],
...
datas=[('/Users/<your_user>/.matplotlib', 'matplotlib/cache')],
...)
-
在代码中设置环境变量:
你可以在代码中设置
TMPDIR
环境变量,使其指向一个持久的位置。
python
import os
os.environ['TMPDIR'] = '/Users/<your_user>/.matplotlib/tmp'
注意: 确保你选择的目录存在,并且你的应用程序有权写入该目录。
在使用上述任何一种解决方案后,重新构建你的应用程序。这应该可以解决由 PyInstaller 应用程序中的不断变化的字体缓存位置引起的问题。
标签:python,macos,caching,matplotlib,pyinstaller From: 40116432