Salome HOME
57438e31cbe03443667356270a4bdaf0879a4fa4
[modules/adao.git] / src / daComposant / daCore / PlatformInfo.py
1 #-*-coding:iso-8859-1-*-
2 #
3 # Copyright (C) 2008-2016 EDF R&D
4 #
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.
9 #
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.
14 #
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
18 #
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
22
23 """
24     Informations sur le code et la plateforme, et mise à jour des chemins
25
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 :
30         print PlatformInfo()
31         print PlatformInfo().getVersion()
32         created = PlatformInfo().getDate()
33
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 :
37         PathManagement()
38 """
39 __author__ = "Jean-Philippe ARGAUD"
40 __all__ = []
41
42 import os
43
44 # ==============================================================================
45 class PlatformInfo(object):
46     """
47     Rassemblement des informations sur le code et la plateforme
48     """
49     def __init__(self):
50         "Sans effet"
51         pass
52
53     def getName(self):
54         "Retourne le nom de l'application"
55         import version as dav
56         return dav.name
57
58     def getVersion(self):
59         "Retourne le numéro de la version"
60         import version as dav
61         return dav.version
62
63     def getDate(self):
64         "Retourne la date de création de la version"
65         import version as dav
66         return dav.date
67
68     def getPythonVersion(self):
69         "Retourne la version de python disponible"
70         import sys
71         return ".".join([str(x) for x in sys.version_info[0:3]]) # map(str,sys.version_info[0:3]))
72
73     def getNumpyVersion(self):
74         "Retourne la version de numpy disponible"
75         import numpy.version
76         return numpy.version.version
77
78     def getScipyVersion(self):
79         "Retourne la version de scipy disponible"
80         import scipy.version
81         return scipy.version.version
82
83     def getMatplotlibVersion(self):
84         "Retourne la version de matplotlib disponible"
85         try:
86             import matplotlib
87             return matplotlib.__version__
88         except ImportError:
89             return "0.0.0"
90
91     def getGnuplotVersion(self):
92         "Retourne la version de gnuplotpy disponible"
93         try:
94             import Gnuplot
95             return Gnuplot.__version__
96         except ImportError:
97             return "0.0"
98
99     def getSphinxVersion(self):
100         "Retourne la version de sphinx disponible"
101         try:
102             import sphinx
103             return sphinx.__version__
104         except ImportError:
105             return "0.0.0"
106
107     def getCurrentMemorySize(self):
108         "Retourne la taille mémoire courante utilisée"
109         return 1
110
111     def MaximumPrecision(self):
112         "Retourne la precision maximale flottante pour Numpy"
113         import numpy
114         try:
115             x = numpy.array([1.,], dtype='float128')
116             mfp = 'float128'
117         except:
118             mfp = 'float64'
119         return mfp
120
121     def __str__(self):
122         import version as dav
123         return "%s %s (%s)"%(dav.name,dav.version,dav.date)
124
125 # ==============================================================================
126 def uniq(sequence):
127     """
128     Fonction pour rendre unique chaque élément d'une liste, en préservant l'ordre
129     """
130     __seen = set()
131     return [x for x in sequence if x not in __seen and not __seen.add(x)]
132
133 # ==============================================================================
134 class PathManagement(object):
135     """
136     Mise à jour du path système pour les répertoires d'outils
137     """
138     def __init__(self):
139         "Déclaration des répertoires statiques"
140         import sys
141         parent = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
142         self.__paths = {}
143         self.__paths["daExternals"] = os.path.join(parent,"daExternals")
144         self.__paths["daMatrices"]  = os.path.join(parent,"daMatrices")
145         self.__paths["daNumerics"]  = os.path.join(parent,"daNumerics")
146         #
147         for v in self.__paths.values():
148             sys.path.insert(0, v )
149         #
150         # Conserve en unique exemplaire chaque chemin
151         sys.path = uniq( sys.path )
152         del parent
153
154     def getpaths(self):
155         """
156         Renvoie le dictionnaire des chemins ajoutés
157         """
158         return self.__paths
159
160 # ==============================================================================
161 class SystemUsage(object):
162     """
163     Permet de récupérer les différentes tailles mémoires du process courant
164     """
165     #
166     # Le module resource renvoie 0 pour les tailles mémoire. On utilise donc
167     # plutôt : http://code.activestate.com/recipes/286222/ et Wikipedia
168     #
169     _proc_status = '/proc/%d/status' % os.getpid()
170     _memo_status = '/proc/meminfo'
171     _scale = {
172         'o'  : 1.0,     # Multiples SI de l'octet
173         'ko' : 1.e3,
174         'Mo' : 1.e6,
175         'Go' : 1.e9,
176         'kio': 1024.0,  # Multiples binaires de l'octet
177         'Mio': 1024.0*1024.0,
178         'Gio': 1024.0*1024.0*1024.0,
179         'B':     1.0,   # Multiples binaires du byte=octet
180         'kB' : 1024.0,
181         'MB' : 1024.0*1024.0,
182         'GB' : 1024.0*1024.0*1024.0,
183         }
184     #
185     def __init__(self):
186         "Sans effet"
187         pass
188     #
189     def _VmA(self, VmKey, unit):
190         "Lecture des paramètres mémoire de la machine"
191         try:
192             t = open(self._memo_status)
193             v = t.read()
194             t.close()
195         except IOError:
196             return 0.0           # non-Linux?
197         i = v.index(VmKey)       # get VmKey line e.g. 'VmRSS:  9999  kB\n ...'
198         v = v[i:].split(None, 3) # whitespace
199         if len(v) < 3:
200             return 0.0           # invalid format?
201         # convert Vm value to bytes
202         mem = float(v[1]) * self._scale[v[2]]
203         return mem / self._scale[unit]
204     #
205     def getAvailablePhysicalMemory(self, unit="o"):
206         "Renvoie la mémoire physique utilisable en octets"
207         return self._VmA('MemTotal:', unit)
208     #
209     def getAvailableSwapMemory(self, unit="o"):
210         "Renvoie la mémoire swap utilisable en octets"
211         return self._VmA('SwapTotal:', unit)
212     #
213     def getAvailableMemory(self, unit="o"):
214         "Renvoie la mémoire totale (physique+swap) utilisable en octets"
215         return self._VmA('MemTotal:', unit) + self._VmA('SwapTotal:', unit)
216     #
217     def getUsableMemory(self, unit="o"):
218         """Renvoie la mémoire utilisable en octets
219         Rq : il n'est pas sûr que ce décompte soit juste...
220         """
221         return self._VmA('MemFree:', unit) + self._VmA('SwapFree:', unit) + \
222                self._VmA('Cached:', unit) + self._VmA('SwapCached:', unit)
223     #
224     def _VmB(self, VmKey, unit):
225         "Lecture des paramètres mémoire du processus"
226         try:
227             t = open(self._proc_status)
228             v = t.read()
229             t.close()
230         except IOError:
231             return 0.0           # non-Linux?
232         i = v.index(VmKey)       # get VmKey line e.g. 'VmRSS:  9999  kB\n ...'
233         v = v[i:].split(None, 3) # whitespace
234         if len(v) < 3:
235             return 0.0           # invalid format?
236         # convert Vm value to bytes
237         mem = float(v[1]) * self._scale[v[2]]
238         return mem / self._scale[unit]
239     #
240     def getUsedMemory(self, unit="o"):
241         "Renvoie la mémoire résidente utilisée en octets"
242         return self._VmB('VmRSS:', unit)
243     #
244     def getVirtualMemory(self, unit="o"):
245         "Renvoie la mémoire totale utilisée en octets"
246         return self._VmB('VmSize:', unit)
247     #
248     def getUsedStacksize(self, unit="o"):
249         "Renvoie la taille du stack utilisé en octets"
250         return self._VmB('VmStk:', unit)
251     #
252     def getMaxUsedMemory(self, unit="o"):
253         "Renvoie la mémoire résidente maximale mesurée"
254         return self._VmB('VmHWM:', unit)
255     #
256     def getMaxVirtualMemory(self, unit="o"):
257         "Renvoie la mémoire totale maximale mesurée"
258         return self._VmB('VmPeak:', unit)
259
260 # ==============================================================================
261 if __name__ == "__main__":
262     print '\n AUTODIAGNOSTIC \n'