`_next_filename()` can cause unintended OSError for "File name too long" on Fedora/Red Hat
@ayjayt 已經在處理了。
開始於 2025年9月26日。
評估
這個 Issue 還沒有評估資料。
描述
Description of the issue
Quickest summary:
- the
kaleido._fig_tools._next_filenamefunction checks if a file atpath / f"{prefix}.{ext}"exists (line 148) - The value of
prefixcan originate from the_build_full_pathfunction in the same module, whereprefixis potentially taken from the title text of a Plotly Figure - If a Plotly figure has a long title, this can lead to an
OSError(dependent on the OS) because the long title text may exceed the OS's max allowable filename length. - In my brief testing, I can reproduce this error on Fedora/Red Hat, but not on Windows 11 (I haven't yet tested macOS).
Note I ran into this error while using Plotly, but traced the source of the error to within the Kaleido package. That's what led me to submit the error here.
One other note: I encountered this error while trying to use fig.to_image(), intending to go directly from a Plotly Figure to in-memory bytes, and saving the bytes to the filesystem elsewhere. In that sense: the check for "does a file with this name exist" in _next_filename is not necessary. That may be an opportunity to decouple the fig.to_image() function from needing to check for existing files.
Potential Fixes
- Slicing first N characters of
prefixin_build_full_pathto a value of N<=100?
# kaleido/_fig_tools.py
def _build_full_path(...):
...
prefix = prefix[:100] or "fig" # line 191
...
- Decouple
fig.to_image()from using_next_filename()as it would not need to check filenames to output in-memory bytes (I think, could be wrong).
I'd be happy to (try to) submit a PR if that would be helpful.
Code to Reproduce
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
# EXAMPLE WITH REASONABLE TITLE
title_text: str = "A title of typical length"
# make a basic figure
df: pd.DataFrame = px.data.gapminder().query("country=='Canada'")
fig: go.Figure = px.line(df, x="year", y="lifeExp", title=title_text)
fig_img_bytes = fig.to_image()
print("Short title bytes:", len(fig_img_bytes))
# EXAMPLE WITH VERY LONG TITLE
title_text: str = f"An exceptionally long title: {'a' * 500}"
# make a basic figure
df: pd.DataFrame = px.data.gapminder().query("country=='Canada'")
fig: go.Figure = px.line(df, x="year", y="lifeExp", title=title_text)
fig_img_bytes = fig.to_image() # <-- causes OSError on Fedora/Red Hat
print("Long title bytes:", len(fig_img_bytes))
Environment to Reproduce
OS:
- Fedora Linux 42 (also tested+observed on Red Hat)
- NOT reproducible on Windows 11 (even with a 1 million-character-long filename)
Python:
- 3.13.7 (also tested+observed on 3.12.7)
Output of pip freeze:
asttokens==3.0.0
attrs==25.3.0
choreographer==1.1.1
comm==0.2.3
debugpy==1.8.17
decorator==5.2.1
executing==2.2.1
fastjsonschema==2.21.2
iniconfig==2.1.0
ipykernel==6.30.1
ipython==9.5.0
ipython-pygments-lexers==1.1.1
jedi==0.19.2
jsonschema==4.25.1
jsonschema-specifications==2025.9.1
jupyter-client==8.6.3
jupyter-core==5.8.1
kaleido==1.1.0
logistro==1.1.0
matplotlib-inline==0.1.7
narwhals==2.5.0
nbformat==5.10.4
nest-asyncio==1.6.0
numpy==2.3.3
orjson==3.11.3
packaging==25.0
pandas==2.3.2
parso==0.8.5
pexpect==4.9.0
platformdirs==4.4.0
plotly==6.3.0
pluggy==1.6.0
prompt-toolkit==3.0.52
psutil==7.1.0
ptyprocess==0.7.0
pure-eval==0.2.3
pygments==2.19.2
pytest==8.4.2
pytest-timeout==2.4.0
python-dateutil==2.9.0.post0
pytz==2025.2
pyzmq==27.1.0
referencing==0.36.2
rpds-py==0.27.1
simplejson==3.20.1
six==1.17.0
stack-data==0.6.3
tornado==6.5.2
traitlets==5.14.3
tzdata==2025.2
wcwidth==0.2.14
Thank you!
- 主要語言
- Python
- 星號
- 504
- 分支
- 65
- 平均合併
- 6 天 9 小時
- 30 天內合併 PR
- 2
環境準備
這個專案沒有提供開發容器、Dockerfile 或貢獻指南,環境需要你自己搭建:先看它的 README,通用步驟見我們的新手貢獻指南。
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
plotly/kaleido 的其他 Issue
-
Writing to an existing directory whose name has a dot fails with "Invalid format"可能已有人在做 @RaphaelFakhri 於 14 天前認領。 未關閉bug P3 size: 1
難度 2/5 1-3 小時 新手友好度 35/100
-
Deterministic Rendering Challenges可能重新可做 @camdecoster 於 69 天前認領,目前沒有進行中的 PR。 未關閉enhancement feature P2 size: 5
-
[FEATURE]: Embed custom fonts into vector exports (no system install)可能已有人在做 @camdecoster 於 126 天前認領。 未關閉enhancement P3 size: 3
-
enhancement feature P3 size: 5
難度 5/5 一週以上 新手友好度 25/100
-
GlobalKaleidoServer is not thread-safe可能已有人在做 @talleibman 於 251 天前認領。 未關閉
難度 4/5 3-5 天 新手友好度 48/100
相似的 Issue
-
難度 2/5 1-3 小時 新手友好度 88/100
didi/helixharness#18 ·
-
request-theme
難度 1/5 1 小時以內 新手友好度 78/100
LizardByte/ThemerrDB#9883 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 75/100
NousResearch/hermes-agent#149885 ·
維護者通常 1 天內回覆
-
Set cache_ok = True on GUID TypeDecorator to enable SQLAlchemy query caching可能已有人在做 @patelshivani2283-lab 今天認領。 未關閉
難度 1/5 1 小時以內 新手友好度 91/100
fedora-infra/anitya#2157 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 84/100
Project-MONAI/MONAI#9258 ·
維護者通常 3 天內回覆