首页 > 编程问答 >pyinstaller:matplotlib 字体缓存更改为生成的应用程序中的 /var/folders

pyinstaller:matplotlib 字体缓存更改为生成的应用程序中的 /var/folders

时间:2024-07-25 06:55:43浏览次数:8  
标签:python macos caching matplotlib pyinstaller

我正在运行 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 环境变量(如果设置了)。

以下是解决此问题的步骤:

  1. 显式设置字体缓存目录: 在你的代码中,在导入 matplotlib 之前,使用 matplotlib.pyplot.rcParams 设置 'cachedir' 参数到你想要使用的目录。这将覆盖默认行为。

python import matplotlib as mpl mpl.rcParams['cachedir'] = '/Users/<your_user>/.matplotlib' import matplotlib.pyplot as plt <your_user> 替换为你的实际用户名。

  1. .spec 文件中设置环境变量: 在你的 PyInstaller .spec 文件中,你可以在 Analysis 部分设置 datas 选项,以包含你的字体缓存目录。

python a = Analysis(['your_script.py'], ... datas=[('/Users/<your_user>/.matplotlib', 'matplotlib/cache')], ...)

  1. 在代码中设置环境变量: 你可以在代码中设置 TMPDIR 环境变量,使其指向一个持久的位置。

python import os os.environ['TMPDIR'] = '/Users/<your_user>/.matplotlib/tmp'

注意: 确保你选择的目录存在,并且你的应用程序有权写入该目录。

在使用上述任何一种解决方案后,重新构建你的应用程序。这应该可以解决由 PyInstaller 应用程序中的不断变化的字体缓存位置引起的问题。

标签:python,macos,caching,matplotlib,pyinstaller
From: 40116432

相关文章

  • 使用 python Flask 发送邮件中的图像
    我想发送一封包含html代码和图像的电子邮件但在gmail中它说图像已附加,我不想要这样,我只想要电子邮件正文中的图像。html_content=f"<imgsrc="cid:banner"alt=""style="width:80%;">"msg=MIMEMultipart('related')html_part=MIMEText(html_c......
  • 在 python requests modul 中,如何检查页面是否使用“POST”方法或“GET”方法
    如何使用python“requests”模块检查页面是否使用“GET”方法或“POST”方法。我期望输出为True或False,或者GET或Post预期代码:importrequestsurl=f"www.get_example.com"response=requests.get(url)ifresponse.check_get==True:print("get")你......
  • VS Code Python - 如果括号(括号、大括号等)未关闭,内联建议不起作用
    我遇到的问题是,当我在未闭合的括号或方括号“内部”开始变量名称时,VSCode将不会显示任何建议。但是,如果在键入变量名称之前闭合括号,则建议效果很好。如果我可以避免它,我宁愿不将自动完成括号关闭设置为True也不使用TabOut扩展。第一个屏幕截图显示建议在闭括号/方......
  • 在 Azure 上部署代码时使用 Python 的多处理模块是否有意义?
    我们的团队在Azure机器学习(AML)上部署了一个Python脚本来处理存储在Azure存储帐户上的文件。我们的管道由一个ForEach活动组成,该活动调用每个或列出的文件的Python脚本。从Azure数据工厂(ADF)运行它会触发多个单独的管道同时运行......
  • 我已成功安装 pypdf2 但无法将其导入到我的 python 文件中
    我已经成功安装了pypdf2模块,但在导入它时,我发现该模块丢失了。我尝试使用fromPyPDF2importPdfReader导入,但它不起作用此问题的各种解决方案是什么?在尝试导入PyPDF2时遇到问题。以下是可能导致此问题的一些常见原因和解决方案:安......
  • Python3打开图片时请求ConnectionResetError(10054)
    我试图从'http://xxx.jpg'之类的网站下载图片。代码:headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/66.0.3359.139Safari/537.36'}url='http://xxx.jpg'resp......
  • Jupyter Notebook 环境中的 Python 版本不匹配
    我遇到Jupyter笔记本启动横幅中报告的Python版本与我在笔记本中查询python--version时显示的版本之间的差异。启动横幅指示Python3.11.9,但是当我运行!python--version时,它返回Python3.11.7。我所做的步骤:basecondahas3.11.7versio......
  • Python XML 解析:字符串中的“<”被阻塞
    我有一个使用ET.XMLParser来解析CppCheckXML报告文件的Python模块。当尝试解析字符串中包含“<”的XML元素中的属性之一时,它会令人窒息,它会将其解释为格式错误的XML,例如:<errormsg="Includefile<iostream>notfound.">(注意字符和“iostream”之间的空格必须放......
  • 任意几行代码要成为Python中的函数需要什么?
    我正在上一门计算机科学课,我的任务是创建一个程序来实现一个带有参数的函数。我的老师告诉我,下面的代码不是一个函数,这让我很困惑,对于将某些代码行归类为“函数”所需的条件,我感到很困惑。defgame(numbers,max_turns,pfl,tgl):turns=0flag=Falseprint("You......
  • 如何使用 Python 创建新的 Azure 订阅?
    我正在尝试使用PythonSDK以编程方式创建新的Azure订阅。我发现的对AzurePythonSDK的唯一引用是这个这是我最终得到的结果:importazure.mgmt.billingimportazure.mgmt.subscriptioncreds=AzureCliCredential()client_name='test'defcreat......