Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit50f399b

Browse files
authored
Merge pull request#30434 from anntzer/pr30426-backport-with-fix
Backport PR#30426: Fix a race condition in TexManager.make_dvi & make_png.
2 parentse9b83ef +4c37903 commit50f399b

File tree

1 file changed

+27
-26
lines changed

1 file changed

+27
-26
lines changed

‎lib/matplotlib/texmanager.py‎

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,9 @@ def make_dvi(cls, tex, fontsize):
276276
277277
Return the file name.
278278
"""
279-
basefile=cls.get_basefile(tex,fontsize)
280-
dvifile='%s.dvi'%basefile
281-
ifnotos.path.exists(dvifile):
282-
texfile=Path(cls.make_tex(tex,fontsize))
283-
# Generate the dvi in a temporary directory to avoid race
279+
dvifile=Path(cls.get_basefile(tex,fontsize)).with_suffix(".dvi")
280+
ifnotdvifile.exists():
281+
# Generate the tex and dvi in a temporary directory to avoid race
284282
# conditions e.g. if multiple processes try to process the same tex
285283
# string at the same time. Having tmpdir be a subdirectory of the
286284
# final output dir ensures that they are on the same filesystem,
@@ -289,15 +287,17 @@ def make_dvi(cls, tex, fontsize):
289287
# the absolute path may contain characters (e.g. ~) that TeX does
290288
# not support; n.b. relative paths cannot traverse parents, or it
291289
# will be blocked when `openin_any = p` in texmf.cnf).
292-
cwd=Path(dvifile).parent
293-
withTemporaryDirectory(dir=cwd)astmpdir:
294-
tmppath=Path(tmpdir)
290+
withTemporaryDirectory(dir=dvifile.parent)astmpdir:
291+
Path(tmpdir,"file.tex").write_text(
292+
cls._get_tex_source(tex,fontsize),encoding='utf-8')
295293
cls._run_checked_subprocess(
296294
["latex","-interaction=nonstopmode","--halt-on-error",
297-
f"--output-directory={tmppath.name}",
298-
f"{texfile.name}"],tex,cwd=cwd)
299-
(tmppath/Path(dvifile).name).replace(dvifile)
300-
returndvifile
295+
"file.tex"],tex,cwd=tmpdir)
296+
Path(tmpdir,"file.dvi").replace(dvifile)
297+
# Also move the tex source to the main cache directory, but
298+
# only for backcompat.
299+
Path(tmpdir,"file.tex").replace(dvifile.with_suffix(".tex"))
300+
returnstr(dvifile)
301301

302302
@classmethod
303303
defmake_png(cls,tex,fontsize,dpi):
@@ -306,22 +306,23 @@ def make_png(cls, tex, fontsize, dpi):
306306
307307
Return the file name.
308308
"""
309-
basefile=cls.get_basefile(tex,fontsize,dpi)
310-
pngfile='%s.png'%basefile
309+
pngfile=Path(cls.get_basefile(tex,fontsize,dpi)).with_suffix(".png")
311310
# see get_rgba for a discussion of the background
312-
ifnotos.path.exists(pngfile):
311+
ifnotpngfile.exists():
313312
dvifile=cls.make_dvi(tex,fontsize)
314-
cmd= ["dvipng","-bg","Transparent","-D",str(dpi),
315-
"-T","tight","-o",pngfile,dvifile]
316-
# When testing, disable FreeType rendering for reproducibility; but
317-
# dvipng 1.16 has a bug (fixed in f3ff241) that breaks --freetype0
318-
# mode, so for it we keep FreeType enabled; the image will be
319-
# slightly off.
320-
if (getattr(mpl,"_called_from_pytest",False)and
321-
mpl._get_executable_info("dvipng").raw_version!="1.16"):
322-
cmd.insert(1,"--freetype0")
323-
cls._run_checked_subprocess(cmd,tex)
324-
returnpngfile
313+
withTemporaryDirectory(dir=pngfile.parent)astmpdir:
314+
cmd= ["dvipng","-bg","Transparent","-D",str(dpi),
315+
"-T","tight","-o","file.png",dvifile]
316+
# When testing, disable FreeType rendering for reproducibility;
317+
# but dvipng 1.16 has a bug (fixed in f3ff241) that breaks
318+
# --freetype0 mode, so for it we keep FreeType enabled; the
319+
# image will be slightly off.
320+
if (getattr(mpl,"_called_from_pytest",False)and
321+
mpl._get_executable_info("dvipng").raw_version!="1.16"):
322+
cmd.insert(1,"--freetype0")
323+
cls._run_checked_subprocess(cmd,tex,cwd=tmpdir)
324+
Path(tmpdir,"file.png").replace(pngfile)
325+
returnstr(pngfile)
325326

326327
@classmethod
327328
defget_grey(cls,tex,fontsize=None,dpi=None):

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp