1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2008-2018 EDF R&D
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
24 Informations sur le code et la plateforme, et mise à jour des chemins
26 La classe "PlatformInfo" permet de récupérer les informations générales sur
27 le code et la plateforme sous forme de strings, ou d'afficher directement
28 les informations disponibles par les méthodes. L'impression directe d'un
29 objet de cette classe affiche les informations minimales. Par exemple :
31 print PlatformInfo().getVersion()
32 created = PlatformInfo().getDate()
34 La classe "PathManagement" permet de mettre à jour les chemins système pour
35 ajouter les outils numériques, matrices... On l'utilise en instanciant
36 simplement cette classe, sans meme récupérer d'objet :
39 __author__ = "Jean-Philippe ARGAUD"
45 # ==============================================================================
46 class PlatformInfo(object):
48 Rassemblement des informations sur le code et la plateforme
55 "Retourne le nom de l'application"
56 import daCore.version as dav
60 "Retourne le numéro de la version"
61 import daCore.version as dav
65 "Retourne la date de création de la version"
66 import daCore.version as dav
69 def getPythonVersion(self):
70 "Retourne la version de python disponible"
71 return ".".join([str(x) for x in sys.version_info[0:3]]) # map(str,sys.version_info[0:3]))
73 def getNumpyVersion(self):
74 "Retourne la version de numpy disponible"
76 return numpy.version.version
78 def getScipyVersion(self):
79 "Retourne la version de scipy disponible"
81 __version = scipy.version.version
86 def getMatplotlibVersion(self):
87 "Retourne la version de matplotlib disponible"
89 __version = matplotlib.__version__
94 def getGnuplotVersion(self):
95 "Retourne la version de gnuplotpy disponible"
97 __version = Gnuplot.__version__
102 def getSphinxVersion(self):
103 "Retourne la version de sphinx disponible"
105 __version = sphinx.__version__
110 def getNloptVersion(self):
111 "Retourne la version de nlopt disponible"
113 __version = "%s.%s.%s"%(
114 nlopt.version_major(),
115 nlopt.version_minor(),
116 nlopt.version_bugfix(),
122 def getCurrentMemorySize(self):
123 "Retourne la taille mémoire courante utilisée"
126 def MaximumPrecision(self):
127 "Retourne la precision maximale flottante pour Numpy"
130 numpy.array([1.,], dtype='float128')
136 def MachinePrecision(self):
137 # Alternative sans module :
141 # eps = (1.0 + eps/2) - 1.0
142 return sys.float_info.epsilon
145 import daCore.version as dav
146 return "%s %s (%s)"%(dav.name,dav.version,dav.date)
148 # ==============================================================================
152 import scipy.optimize
159 has_matplotlib = True
161 has_matplotlib = False
181 has_salome = bool( "ROOT_SALOME" in os.environ )
182 has_yacs = bool( "YACS_ROOT_DIR" in os.environ )
183 has_adao = bool( "ADAO_ROOT_DIR" in os.environ )
185 # ==============================================================================
188 Fonction pour rendre unique chaque élément d'une liste, en préservant l'ordre
191 return [x for x in sequence if x not in __seen and not __seen.add(x)]
193 # ==============================================================================
194 class PathManagement(object):
196 Mise à jour du path système pour les répertoires d'outils
199 "Déclaration des répertoires statiques"
200 parent = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
202 self.__paths["daExternals"] = os.path.join(parent,"daExternals")
203 self.__paths["daMatrices"] = os.path.join(parent,"daMatrices")
204 self.__paths["daNumerics"] = os.path.join(parent,"daNumerics")
206 for v in self.__paths.values():
207 sys.path.insert(0, v )
209 # Conserve en unique exemplaire chaque chemin
210 sys.path = uniq( sys.path )
215 Renvoie le dictionnaire des chemins ajoutés
219 # ==============================================================================
220 class SystemUsage(object):
222 Permet de récupérer les différentes tailles mémoires du process courant
225 # Le module resource renvoie 0 pour les tailles mémoire. On utilise donc
226 # plutôt : http://code.activestate.com/recipes/286222/ et Wikipedia
228 _proc_status = '/proc/%d/status' % os.getpid()
229 _memo_status = '/proc/meminfo'
231 'o' : 1.0, # Multiples SI de l'octet
235 'kio': 1024.0, # Multiples binaires de l'octet
236 'Mio': 1024.0*1024.0,
237 'Gio': 1024.0*1024.0*1024.0,
238 'B': 1.0, # Multiples binaires du byte=octet
240 'MB' : 1024.0*1024.0,
241 'GB' : 1024.0*1024.0*1024.0,
248 def _VmA(self, VmKey, unit):
249 "Lecture des paramètres mémoire de la machine"
251 t = open(self._memo_status)
255 return 0.0 # non-Linux?
256 i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
257 v = v[i:].split(None, 3) # whitespace
259 return 0.0 # invalid format?
260 # convert Vm value to bytes
261 mem = float(v[1]) * self._scale[v[2]]
262 return mem / self._scale[unit]
264 def getAvailablePhysicalMemory(self, unit="o"):
265 "Renvoie la mémoire physique utilisable en octets"
266 return self._VmA('MemTotal:', unit)
268 def getAvailableSwapMemory(self, unit="o"):
269 "Renvoie la mémoire swap utilisable en octets"
270 return self._VmA('SwapTotal:', unit)
272 def getAvailableMemory(self, unit="o"):
273 "Renvoie la mémoire totale (physique+swap) utilisable en octets"
274 return self._VmA('MemTotal:', unit) + self._VmA('SwapTotal:', unit)
276 def getUsableMemory(self, unit="o"):
277 """Renvoie la mémoire utilisable en octets
278 Rq : il n'est pas sûr que ce décompte soit juste...
280 return self._VmA('MemFree:', unit) + self._VmA('SwapFree:', unit) + \
281 self._VmA('Cached:', unit) + self._VmA('SwapCached:', unit)
283 def _VmB(self, VmKey, unit):
284 "Lecture des paramètres mémoire du processus"
286 t = open(self._proc_status)
290 return 0.0 # non-Linux?
291 i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
292 v = v[i:].split(None, 3) # whitespace
294 return 0.0 # invalid format?
295 # convert Vm value to bytes
296 mem = float(v[1]) * self._scale[v[2]]
297 return mem / self._scale[unit]
299 def getUsedMemory(self, unit="o"):
300 "Renvoie la mémoire résidente utilisée en octets"
301 return self._VmB('VmRSS:', unit)
303 def getVirtualMemory(self, unit="o"):
304 "Renvoie la mémoire totale utilisée en octets"
305 return self._VmB('VmSize:', unit)
307 def getUsedStacksize(self, unit="o"):
308 "Renvoie la taille du stack utilisé en octets"
309 return self._VmB('VmStk:', unit)
311 def getMaxUsedMemory(self, unit="o"):
312 "Renvoie la mémoire résidente maximale mesurée"
313 return self._VmB('VmHWM:', unit)
315 def getMaxVirtualMemory(self, unit="o"):
316 "Renvoie la mémoire totale maximale mesurée"
317 return self._VmB('VmPeak:', unit)
319 # ==============================================================================
320 if __name__ == "__main__":
321 print('\n AUTODIAGNOSTIC \n')