Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""
2@file
3@brief Looks for paths, Miktek, Graphviz...
4"""
5import sys
6import os
7import errno
10def find_in_PATH(prog):
11 """
12 look into every path mentioned in ``%PATH%`` a specific file,
13 it raises an exception if not Found
15 @param prog program to look for
16 @return path
17 """
18 sep = ";" if sys.platform.startswith("win") else ":"
19 path = os.environ["PATH"]
20 for p in path.split(sep):
21 f = os.path.join(p, prog)
22 if os.path.exists(f):
23 return p # pragma: no cover
24 return None
27def find_graphviz_dot(exc=True):
28 """
29 Determines the path to graphviz (on Windows),
30 the function tests the existence of versions 34 to 45
31 assuming it was installed in a standard folder:
32 ``C:\\Program Files\\MiKTeX 2.9\\miktex\\bin\\x64``.
34 :param exc: raise exception of be silent
35 :return: path to dot
36 :raises FileNotFoundError: if graphviz not found
37 """
38 if sys.platform.startswith("win"): # pragma: no cover
39 version = list(range(34, 60))
40 version.extend(["{}.1".format(v) for v in version])
41 for v in version:
42 graphviz_dot = (
43 "C:\\Program Files (x86)\\Graphviz2.{0}\\bin\\dot.exe"
44 "".format(v))
45 if os.path.exists(graphviz_dot):
46 return graphviz_dot
47 extra = ['build/update_modules/Graphviz/bin']
48 for ext in extra:
49 graphviz_dot = os.path.join(ext, "dot.exe")
50 if os.path.exists(graphviz_dot):
51 return graphviz_dot
52 p = find_in_PATH("dot.exe")
53 if p is None:
54 if exc:
55 typstr = str
56 raise FileNotFoundError(
57 "Unable to find graphviz, look into paths such as {}"
58 ".".format(typstr(graphviz_dot)))
59 return None
60 return os.path.join(p, "dot.exe")
61 # linux
62 return "dot"
65def find_latex_path(exc=True):
66 """
67 Finds latex path.
68 Returns an empty string on :epkg:`linux`.
70 :param exc: raises an exception or be silent
71 :return: something like
72 ``C:\\Program Files\\MiKTeX 2.9\\miktex\\bin\\x64``
73 :raises FileNotFoundError: if latex not found
74 """
75 if sys.platform.startswith("win"): # pragma: no cover
76 latex = latex0 = r"C:\Program Files\MiKTeX 2.9\miktex\bin\x64"
77 if not os.path.exists(latex):
78 latex = find_in_PATH("latex.exe")
79 if latex is None or not os.path.exists(latex):
80 if exc:
81 typstr = str
82 raise FileNotFoundError(
83 "Unable to find latex (miktex), "
84 "look into paths such as %r." % typstr(latex0))
85 return None
86 return latex
87 # linux, should be in PATH.
88 return ""
91def find_pandoc_path(exc=True):
92 """
93 Determines :epkg:`pandoc` location.
94 Returns an empty string on :epkg:`linux`.
96 @return path to :epkg:`pandoc`
97 """
98 if sys.platform.startswith("win"): # pragma: no cover
99 path = os.environ["USERPROFILE"]
100 pandoc = os.path.join(path, "AppData", "Local", "Pandoc")
101 pdoc = os.path.join(pandoc, "pandoc.exe")
102 if os.path.exists(pdoc):
103 return pandoc
104 tries = [pandoc]
106 path = os.environ["ProgramFiles(x86)"]
107 pandoc = os.path.join(path, "Pandoc")
108 pdoc = os.path.join(pandoc, "pandoc.exe")
109 if os.path.exists(pdoc):
110 return pandoc
111 tries.append(pandoc)
113 if not os.path.exists(pandoc):
114 # we try others users because pandoc goes into
115 # a user folder by default.
116 root = os.path.normpath(os.path.join(path, ".."))
117 users = os.listdir(root)
118 for u in users:
119 p = os.path.join(root, u)
120 if os.path.isdir(p):
121 pandoc = os.path.join(p, "AppData", "Local", "Pandoc")
122 if os.path.exists(pandoc):
123 return pandoc
124 tries.append(pandoc)
125 pandoc = find_in_PATH("pandoc.exe")
126 if pandoc is None and exc:
127 raise FileNotFoundError(
128 "Unable to find pandoc, look into paths such "
129 "as:" + "\n".join(tries))
130 return pandoc
131 return pandoc
132 # linux, should be in PATH.
133 return ""
136def custom_ensuredir(path):
137 """Ensure that a path exists."""
138 if "IMPOSSIBLE:TOFIND" in path:
139 return
140 try:
141 os.makedirs(path)
142 except OSError as err:
143 # 0 for Jython/Win32
144 EEXIST = getattr(errno, 'EEXIST', 0)
145 if err.errno not in [0, EEXIST]:
146 raise # pragma: no cover
149def find_dvipng_path(exc=True):
150 """
151 Determines :epkg:`dvipng` location.
153 @return *imgmath_latex*, *imgmath_dvipng*,
154 *imgmath_dvisvgm*
155 """
157 if sys.platform.startswith("win"): # pragma: no cover
158 sep = ";"
159 imgmath_latex = find_latex_path(exc=exc)
160 if imgmath_latex is None:
161 imgmath_dvipng = None
162 else:
163 imgmath_dvipng = os.path.join(imgmath_latex, "dvipng.exe")
164 if imgmath_dvipng is None or not os.path.exists(imgmath_dvipng):
165 if exc:
166 raise FileNotFoundError(imgmath_dvipng)
167 imgmath_dvipng = "dvipng"
168 if imgmath_latex is None:
169 imgmath_dvisvgm = None
170 else:
171 imgmath_dvisvgm = os.path.join(imgmath_latex, "dvisvgm.exe")
172 if imgmath_dvisvgm is None or not os.path.exists(imgmath_dvisvgm):
173 if exc:
174 raise FileNotFoundError(imgmath_dvisvgm)
175 imgmath_dvisvgm = "dvisvgm"
177 env_path = os.environ.get("PATH", "")
178 if imgmath_latex and imgmath_latex not in env_path:
179 if len(env_path) > 0:
180 env_path += sep
181 env_path += imgmath_latex
183 if imgmath_latex is not None and sys.platform.startswith("win"):
184 imgmath_latex = os.path.join(imgmath_latex, "latex.exe")
186 # verification
187 if imgmath_latex is None or not os.path.exists(imgmath_latex):
188 if exc:
189 raise FileNotFoundError(imgmath_latex)
190 imgmath_latex = "latex"
191 if imgmath_dvipng is None or not os.path.exists(imgmath_dvipng):
192 if exc:
193 raise FileNotFoundError(imgmath_dvipng)
194 imgmath_dvipng = "dvipng"
195 else:
196 # On linux, we expect latex, dvipng, dvisvgm to be available.
197 imgmath_latex = "latex"
198 imgmath_dvipng = "dvipng"
199 imgmath_dvisvgm = "dvisvgm"
201 return imgmath_latex, imgmath_dvipng, imgmath_dvisvgm