Hide keyboard shortcuts

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 

8 

9 

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 

14 

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 

25 

26 

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``. 

33 

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" 

63 

64 

65def find_latex_path(exc=True): 

66 """ 

67 Finds latex path. 

68 Returns an empty string on :epkg:`linux`. 

69 

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 "" 

89 

90 

91def find_pandoc_path(exc=True): 

92 """ 

93 Determines :epkg:`pandoc` location. 

94 Returns an empty string on :epkg:`linux`. 

95 

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] 

105 

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) 

112 

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 "" 

134 

135 

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 

147 

148 

149def find_dvipng_path(exc=True): 

150 """ 

151 Determines :epkg:`dvipng` location. 

152 

153 @return *imgmath_latex*, *imgmath_dvipng*, 

154 *imgmath_dvisvgm* 

155 """ 

156 

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" 

176 

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 

182 

183 if imgmath_latex is not None and sys.platform.startswith("win"): 

184 imgmath_latex = os.path.join(imgmath_latex, "latex.exe") 

185 

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" 

200 

201 return imgmath_latex, imgmath_dvipng, imgmath_dvisvgm