@@ -152,11 +152,6 @@ def _comparable_version(version):
152152
153153### Platform specific APIs
154154
155- _libc_search = re .compile (b'(__libc_init)'
156- b'|'
157- b'(GLIBC_([0-9.]+))'
158- b'|'
159- br'(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)' , re .ASCII )
160155
161156def libc_ver (executable = None , lib = '' , version = '' , chunksize = 16384 ):
162157
@@ -190,6 +185,12 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384):
190185 # sys.executable is not set.
191186 return lib , version
192187
188+ _libc_search = re .compile (b'(__libc_init)'
189+ b'|'
190+ b'(GLIBC_([0-9.]+))'
191+ b'|'
192+ br'(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)' , re .ASCII )
193+
193194 V = _comparable_version
194195 # We use os.path.realpath()
195196 # here to work around problems with Cygwin not being
@@ -247,9 +248,6 @@ def _norm_version(version, build=''):
247248 version = '.' .join (strings [:3 ])
248249 return version
249250
250- _ver_output = re .compile (r'(?:([\w ]+) ([\w.]+) '
251- r'.*'
252- r'\[.* ([\d.]+)\])' )
253251
254252# Examples of VER command output:
255253#
@@ -295,6 +293,10 @@ def _syscmd_ver(system='', release='', version='',
295293 else :
296294 return system , release , version
297295
296+ _ver_output = re .compile (r'(?:([\w ]+) ([\w.]+) '
297+ r'.*'
298+ r'\[.* ([\d.]+)\])' )
299+
298300 # Parse the output
299301 info = info .strip ()
300302 m = _ver_output .match (info )
@@ -1033,18 +1035,6 @@ def processor():
10331035
10341036### Various APIs for extracting information from sys.version
10351037
1036- _sys_version_parser = re .compile (
1037- r'([\w.+]+)\s*' # "version<space>"
1038- r'\(#?([^,]+)' # "(#buildno"
1039- r'(?:,\s*([\w ]*)' # ", builddate"
1040- r'(?:,\s*([\w :]*))?)?\)\s*' # ", buildtime)<space>"
1041- r'\[([^\]]+)\]?' , re .ASCII ) # "[compiler]"
1042-
1043- _pypy_sys_version_parser = re .compile (
1044- r'([\w.+]+)\s*'
1045- r'\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*'
1046- r'\[PyPy [^\]]+\]?' )
1047-
10481038_sys_version_cache = {}
10491039
10501040def _sys_version (sys_version = None ):
@@ -1076,6 +1066,13 @@ def _sys_version(sys_version=None):
10761066 if result is not None :
10771067 return result
10781068
1069+ _sys_version_parser = re .compile (
1070+ r'([\w.+]+)\s*' # "version<space>"
1071+ r'\(#?([^,]+)' # "(#buildno"
1072+ r'(?:,\s*([\w ]*)' # ", builddate"
1073+ r'(?:,\s*([\w :]*))?)?\)\s*' # ", buildtime)<space>"
1074+ r'\[([^\]]+)\]?' , re .ASCII ) # "[compiler]"
1075+
10791076 if sys .platform .startswith ('java' ):
10801077 # Jython
10811078 name = 'Jython'
@@ -1091,6 +1088,11 @@ def _sys_version(sys_version=None):
10911088
10921089 elif "PyPy" in sys_version :
10931090 # PyPy
1091+ _pypy_sys_version_parser = re .compile (
1092+ r'([\w.+]+)\s*'
1093+ r'\(#?([^,]+),\s*([\w ]+),\s*([\w :]+)\)\s*'
1094+ r'\[PyPy [^\]]+\]?' )
1095+
10941096 name = "PyPy"
10951097 match = _pypy_sys_version_parser .match (sys_version )
10961098 if match is None :
@@ -1290,17 +1292,6 @@ def platform(aliased=False, terse=False):
12901292### freedesktop.org os-release standard
12911293# https://www.freedesktop.org/software/systemd/man/os-release.html
12921294
1293- # NAME=value with optional quotes (' or "). The regular expression is less
1294- # strict than shell lexer, but that's ok.
1295- _os_release_line = re .compile (
1296- "^(?P<name>[a-zA-Z0-9_]+)=(?P<quote>[\" \' ]?)(?P<value>.*)(?P=quote)$"
1297- )
1298- # unescape five special characters mentioned in the standard
1299- _os_release_unescape = re .compile (r"\\([\\\$\"\'`])" )
1300- # /etc takes precedence over /usr/lib
1301- _os_release_candidates = ("/etc/os-release" , "/usr/lib/os-release" )
1302- _os_release_cache = None
1303-
13041295
13051296def _parse_os_release (lines ):
13061297 # These fields are mandatory fields with well-known defaults
@@ -1311,6 +1302,14 @@ def _parse_os_release(lines):
13111302 "PRETTY_NAME" : "Linux" ,
13121303 }
13131304
1305+ # NAME=value with optional quotes (' or "). The regular expression is less
1306+ # strict than shell lexer, but that's ok.
1307+ _os_release_line = re .compile (
1308+ "^(?P<name>[a-zA-Z0-9_]+)=(?P<quote>[\" \' ]?)(?P<value>.*)(?P=quote)$"
1309+ )
1310+ # unescape five special characters mentioned in the standard
1311+ _os_release_unescape = re .compile (r"\\([\\\$\"\'`])" )
1312+
13141313 for line in lines :
13151314 mo = _os_release_line .match (line )
13161315 if mo is not None :
@@ -1326,6 +1325,10 @@ def freedesktop_os_release():
13261325 """
13271326 global _os_release_cache
13281327
1328+ # /etc takes precedence over /usr/lib
1329+ _os_release_candidates = ("/etc/os-release" , "/usr/lib/os-release" )
1330+ _os_release_cache = None
1331+
13291332 if _os_release_cache is None :
13301333 errno = None
13311334 for candidate in _os_release_candidates :
0 commit comments