docker 运行openpifpaf+falldetection 出现Matplotlib is currently using agg, which is a non-GUl无法显示图像

该博客提供了解决容器内绘图问题的方案。进入容器运行python3,将搜索到的'#backend : Agg'替换为'backend : TkAgg'。若载入openpifpaf模块后又变回Agg,需排查修改core、visualizer和show模块代码,将'malplotlib.use(‘Agg’)'改为'malplotlib.use(‘TkAgg’)',修改后运行可显示图像。

在这里插入图片描述

解决方案:

进入容器后运行python3

>>>import matplotlib
>>>print(matplotlib.get_backend())
Agg

这时候如果显示的是Agg而不是TkAgg,则需要修改matplotlibrc 文件,
不是的话则跳过这一步
退出python3
sudo geidt  /opt/conda/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc


搜索:#backend : Agg
替换为:backend : TkAgg

此时再打开python3

>>>import matplotlib
>>>print(matplotlib.get_backend())
TkAgg
>>>import openpifpaf
>>>print(matplotlib.get_backend())
Agg

如果载入了openpifpaf模块后变成了Agg,则说明需要修改模块中的代码.经过 form XXX import openpifpaf 的排查,发现core和visualizer和show改变了TkAgg,所以修改里面相对应的文件,将malplotlib.use(‘Agg’)修改成malplotlib.use(‘TkAgg’),每修改一个(例如修改完了show里面的)就进入一次python3查看是否还会修改成Agg

在这里插入图片描述在这里插入图片描述
修改完后运行就出现图像了
在这里插入图片描述

<think>我们有两个问题需要解决:1.文件写入时的权限错误:PermissionError:[Errno13]Permissiondenied2.Matplotlib使用非GUI后端导致的警告:UserWarning:cannotshowthefigurebecauseitisusingaggbackend下面分别提供解决方案。##一、解决文件写入权限错误(PermissionError)当尝试写入文件时出现权限错误,通常由以下原因引起:-文件已被其他程序(如Excel、文本编辑器)打开-目标目录没有写入权限-程序没有以管理员权限运行(在需要管理员权限的目录中)###解决方案:**1.检查文件是否被占用**-关闭可能打开目标文件的程序(如Excel、记事本等)-如果程序自身之前生成了该文件并保持打开状态,确保正确关闭文件句柄**2.更改目标路径**-尝试将文件保存到用户有写入权限的目录(如用户文档目录、临时目录)-使用Python获取安全目录:```pythonimportosfrompathlibimportPath#方法1:用户文档目录docs_dir=Path.home()/'Documents'safe_path=docs_dir/'latin_hypercube_samples.csv'#方法2:临时目录importtempfiletemp_dir=Path(tempfile.gettempdir())safe_path=temp_dir/'latin_hypercube_samples.csv'samples_df.to_csv(safe_path,index=False)```**3.使用异常处理重试**-当检测到权限错误时,等待并重试(适用于文件被暂时锁定的情况)```pythonimporttimefile_path='latin_hypercube_samples.csv'max_retries=5foriinrange(max_retries):try:samples_df.to_csv(file_path,index=False)break#成功则跳出循环exceptPermissionError:ifi==max_retries-1:raise#重试次数用尽,抛出异常time.sleep(2)#等待2秒后重试```**4.以管理员身份运行程序**-在Windows系统,右键点击运行Python的IDE或命令行,选择“以管理员身份运行”**5.检查文件路径格式(Windows)**-避免路径中的转义字符错误,使用原始字符串或双反斜杠```python#错误示例(包含转义字符)bad_path='D:\new\data.csv'#\n被解释为换行符#正确方法1:原始字符串good_path=r'D:\new\data.csv'#正确方法2:正斜杠good_path='D:/new/data.csv'#正确方法3:使用Path对象(推荐)frompathlibimportPathgood_path=Path('D:/new/data.csv')```**6.通过文件对象写入**-使用`open`上下文管理确保文件正确关闭```pythonwithopen(file_path,'w',newline='')asf:samples_df.to_csv(f,index=False)```如果以上方法无效,可能是系统级权限问题,需检查文件夹安全设置或使用命令行修改权限。##二、解决Matplotlib非GUI后端警告当在无图形界面的环境(如某些Linux服务器)使用Matplotlib时,默认使用`agg`后端(非交互式),无法显示图形。警告信息:```UserWarning:Matplotlibiscurrentlyusingagg,whichisanon-GUIbackend,socannotshowthefigure.```###解决方案:**1.安装交互式后端(推荐Tkinter)**-在Python环境中安装`tkinter`包(通常已包含在标准库,但某些环境可能缺失)```bash#Ubuntu/Debiansudoapt-getinstallpython3-tk#Windows/macOS:通常已安装,未安装则通过Python安装器添加```**2.在代码中指定GUI后端**-在导入`matplotlib.pyplot`之前设置后端```pythonimportmatplotlibmatplotlib.use('TkAgg')#或其他可用后端如'Qt5Agg'importmatplotlib.pyplotasplt```**3.使用非显示模式的方法**-如果不需要显示图形(如批量生成图片),可忽略警告或改为保存图片```pythonplt.savefig('output.png')#保存图形#plt.show()#注释掉show调用```**4.检查后端可用性**-列出当前系统可用后端:```pythonimportmatplotlibprint(matplotlib.rcsetup.interactive_bk)#交互式后端print(matplotlib.rcsetup.non_interactive_bk)#非交互式后端```**5.使用虚拟显示(Linux服务器无显示器时)**-安装`xvfb`并设置虚拟显示```bashsudoapt-getinstallxvfb```-运行前设置环境变量:```bashexportDISPLAY=:0xvfb-run-apythonyour_script.py```###代码示例:完整解决两个问题```python#解决文件权限问题importpandasaspdimporttimefrompathlibimportPath#创建示例数据框samples_df=pd.DataFrame({'param1':[1,2,3],'param2':[4,5,6]})#安全写入函数defsafe_to_csv(df,path,max_retries=3):foriinrange(max_retries):try:#使用Path对象避免路径问题p=Path(path)withp.open('w',newline='')asf:df.to_csv(f,index=False)returnexceptPermissionError:ifi<max_retries-1:time.sleep(2)else:raise#写入到用户文档目录避免权限问题output_path=Path.home()/'Documents'/'latin_hypercube_samples.csv'safe_to_csv(samples_df,output_path)#解决Matplotlib后端问题importmatplotlib#尝试使用Tkinter后端matplotlib.use('TkAgg')#如果失败,可尝试'Qt5Agg'或其他importmatplotlib.pyplotaspltplt.plot([1,2,3],[4,5,1])plt.savefig('plot.png')#保存图像plt.show()#现在可以正常显示(如果环境支持)```##总结-**权限问题**:优先检查文件占用和目录权限,使用用户目录或临时目录可规避系统权限限制[^1][^2]。-**Matplotlib后端问题**:安装GUI依赖或显式设置后端,无图形界面时改用保存图片[^3]。§§相关问题§§1.如何在Windows系统中排查文件被哪个进程占用?2.除Tkinter外,Matplotlib还支持哪些常见的交互式后端?3.如何在Docker容器中运行需要图形显示Matplotlib程序?4.Pandas保存CSV时如何避免因权限问题导致的数据丢失?</think>### 解决 Python 文件写入权限错误与 Matplotlib 后端警告 #### 一、解决 `PermissionError: [Errno 13] Permission denied` 错误 当 Pandas 尝试写入 CSV 文件时出现权限错误,通常由以下原因导致: ##### 1. **文件被占用(最常见)** - Excel/文本编辑器已打开目标文件 - 解决方案: ```python import pandas as pd import time # 方法1:重命名保存 samples_df.to_csv('new_latin_samples.csv', index=False) # 方法2:重试机制(最多5次) for i in range(5): try: samples_df.to_csv('latin_hypercube_samples.csv', index=False) break except PermissionError: time.sleep(2) # 等待2秒 ``` ##### 2. **目录权限不足** - Python 无目标目录写入权限 - 解决方案: ```python import os from pathlib import Path # 保存到用户文档目录 docs_dir = Path.home() / 'Documents' safe_path = docs_dir / 'latin_hypercube_samples.csv' samples_df.to_csv(safe_path) # 或使用临时目录 import tempfile temp_path = Path(tempfile.gettempdir()) / 'temp_samples.csv' samples_df.to_csv(temp_path) ``` ##### 3. **路径格式问题(Windows)** - 反斜杠转义错误 - 解决方案: ```python # 使用原始字符串 safe_path = r'D:\research\samples\latin_hypercube_samples.csv' # 或使用正斜杠 safe_path = 'D:/research/samples/latin_hypercube_samples.csv' # 或Path对象 from pathlib import Path safe_path = Path('D:/research/samples') / 'latin_hypercube_samples.csv' ``` ##### 4. **系统级解决方案** ```powershell # PowerShell管理员命令:授予Users组完全控制权限 icacls "D:\研究生\科研" /grant "Users:(OI)(CI)F" ``` #### 二、解决 Matplotlib `UserWarning: cannot show the figure because it is using agg backend` 此警告表示 Matplotlib 当前使用非交互式后端(agg),无法显示图形窗口。 ##### 1. **安装 GUI 后端** ```bash # 安装Tkinter(Windows/macOS) conda install tk # Ubuntu/Debian sudo apt-get install python3-tk ``` ##### 2. **代码中指定后端** ```python import matplotlib matplotlib.use('TkAgg') # 在导入pyplot前设置 import matplotlib.pyplot as plt # 现在可以正常显示 plt.plot([1, 2, 3], [4, 5, 1]) plt.show() ``` ##### 3. **无 GUI 环境的替代方案** ```python # 保存图像代替显示 plt.savefig('plot.png', dpi=300) # 使用非交互式后端渲染 from matplotlib.backends.backend_agg import FigureCanvasAgg fig, ax = plt.subplots() ax.plot([1, 2, 3], [4, 5, 1]) canvas = FigureCanvasAgg(fig) canvas.draw() ``` ##### 4. **永久修改默认配置** 创建 `~/.matplotlib/matplotlibrc` 文件,添加: ``` backend: TkAgg ``` ### 完整解决方案示例 ```python # 文件权限处理 + 图形后端配置 import pandas as pd import matplotlib import time from pathlib import Path # 1. 解决Matplotlib警告 matplotlib.use('TkAgg') # 设置GUI后端 import matplotlib.pyplot as plt # 2. 安全保存函数 def safe_save(df, filename, max_retries=3): for i in range(max_retries): try: with open(filename, 'w') as f: df.to_csv(f, index=False) return True except PermissionError: time.sleep(2) # 终极方案:保存到临时目录 temp_file = Path(tempfile.gettempdir()) / filename.name df.to_csv(temp_file) print(f"文件已保存到临时目录: {temp_file}") return False # 使用示例 data = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) output_file = Path('D:/research/latin_hypercube_samples.csv') safe_save(data, output_file) # 图形测试 plt.plot(data['A'], data['B'], 'ro-') plt.savefig('result_plot.png') # 保存图像 plt.show() # 正常显示 ``` ### 总结建议 1. **文件权限问题**优先检查文件占用和目录权限,使用临时目录或用户目录可规避系统限制[^1][^2] 2. **Matplotlib 警告**需安装 GUI 后端或显式指定渲染器[^3] 3. 在服务器等无 GUI 环境时,用 `plt.savefig()` 替代 `plt.show()`
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值