【问题标题】:Setting Matplotlib MPLCONFIGDIR: consider setting MPLCONFIGDIR to a writable directory for matplotlib configuration data设置 Matplotlib MPLCONFIGDIR:考虑将 MPLCONFIGDIR 设置为 matplotlib 配置数据的可写目录
【发布时间】:2012-03-22 17:26:36
【问题描述】:

我正在使用 Linux 服务器来建立一个 django 项目。我收到此错误:“无法创建 /var/www/.matplotlib;考虑将 MPLCONFIGDIR 设置为 matplotlib 配置数据的可写目录”

然后我发现 $MPLCONFIGDIR 是空的。所以我这样设置:

lab@base:~$ export MPLCONFIGDIR=~/website/graph
lab@base:~$ echo $MPLCONFIGDIR
/home/lab/website/graph

此路径是我要存储 Matplotlib 创建的图像的目录。 然后我在 python 命令行中确定了这个设置:

>>> import matplotlib
>>> import os
>>> os.environ.get('MPLCONFIGDIR')
'/home/lab/website/graph'

但是,在使用 mod_wsgi 部署在 Apache 中的 django 项目中,仍然存在上述错误。我添加了以下几行:

import os
os.environ['MPLCONFIGDIR'] = "/home/lab/website/graph"
print(os.environ.get('MPLCONFIGDIR'))

它打印“无”!

谁能帮帮我?

谢谢。

【问题讨论】:

  • 啊哈,当我遇到与mapplotlib 相同的问题时,如果我知道要搜索什么就好了。我将代码回溯到找到configdir = os.environ.get('MPLCONFIGDIR') 的位置。我猜异常堆栈跟踪从未告诉过我。

标签: matplotlib


【解决方案1】:

在导入 matplotlib 之前在代码中设置 MPLCONFIGDIR。确保目录具有权限,以便应用程序可以写入。

import os
os.environ['MPLCONFIGDIR'] = "/home/lab/website/graph"
import matplotlib

或者,您可以将其设置为临时文件。

import os    
import tempfile
os.environ['MPLCONFIGDIR'] = tempfile.mkdtemp()
import matplotlib

【讨论】:

  • 谢谢。这也是我们的情况。
  • mkdtemp 的输出不会在执行停止时自动删除。另一种方法是使用同一包中的TemporaryDirectory。请参阅下面的答案:)
  • 如果您碰巧在 AWS Lambda 上工作,就像我来寻找答案时一样,请改用 /tmp 文件夹。
【解决方案2】:

根据@Esteban,我在模块或脚本中做这样的事情:

import os

try:
    import matplotlib
except:
    import tempfile
    import atexit
    import shutil

    mpldir = tempfile.mkdtemp()
    atexit.register(shutil.rmtree, mpldir)  # rm directory on succ exit

    os.environ['MPLCONFIGDIR'] = mpldir

    import matplotlib

这样临时目录在退出时会被删除。

【讨论】:

    【解决方案3】:

    如果您更喜欢使用脚本执行后将被删除的临时目录,请将下面的 sn-p 添加到 main.py 或等效项的开头。

    import os
    import tempfile
    temp_dir = tempfile.TemporaryDirectory()
    os.environ['MPLCONFIGDIR'] = temp_dir.name
    

    请注意,与TemporaryDirectory 不同,mkdtemp 的输出不会被删除,您需要手动完成。

    更多关于TemporaryDirectorymkdtemphere的信息。

    【讨论】:

    • 这是个好主意!但是,如果不在上下文管理器中使用,我不确定该目录是否会在退出时实际删除。 “此函数使用 mkdtemp() 创建一个临时目录(提供的参数直接传递给底层函数)。生成的对象可以用作上下文管理器(请参阅使用语句上下文管理器)。在完成上下文或销毁临时目录对象 新创建的临时目录及其所有内容都从文件系统中删除。"
    • @Esteban 我的假设是,当脚本执行完成时,它算作“上下文完成”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2021-11-08
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2016-04-11
    • 2017-09-28
    相关资源
    最近更新 更多