`_next_filename()` can cause unintended OSError for "File name too long" on Fedora/Red Hat
@ayjayt já está trabalhando nisso.
Desde 26/9/2025.
Avaliação
Esta issue ainda não foi avaliada.
Descrição
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!
- Linguagem predominante
- Python
- Estrelas
- 504
- Forks
- 65
- Merge médio
- 6d 9h
- PRs com merge (30d)
- 2
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de plotly/kaleido
-
Writing to an existing directory whose name has a dot fails with "Invalid format"Talvez já em andamento @RaphaelFakhri assumiu há 14 dias. Abertabug P3 size: 1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 35/100
-
Deterministic Rendering ChallengesTalvez livre de novo @camdecoster assumiu há 69 dias e não há nenhum pull request aberto. Abertaenhancement feature P2 size: 5
-
[FEATURE]: Embed custom fonts into vector exports (no system install)Talvez já em andamento @camdecoster assumiu há 126 dias. Abertaenhancement P3 size: 3
-
enhancement feature P3 size: 5
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 25/100
-
GlobalKaleidoServer is not thread-safeTalvez já em andamento @talleibman assumiu há 251 dias. Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
Todas as issues de plotly/kaleido
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
fritzprix/libr-agent#2612 ·
Mantenedores costumam responder em até 1 dia
-
needs-triage presubmit-gate
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
gke-labs/kube-agents#5001 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
simonw/sqlite-utils#928 ·
Mantenedores costumam responder em até 3 dias
-
colorado
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
freelawproject/juriscraper#2405 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
cline/mcp-marketplace#3576 ·