136136 'pl' : 200 , 'p' : 200 ,
137137}
138138
139- _component_re = re .compile (r'([0-9]+|[._+-])' )
140139
141140def _comparable_version (version ):
141+ component_re = re .compile (r'([0-9]+|[._+-])' )
142142 result = []
143- for v in _component_re .split (version ):
143+ for v in component_re .split (version ):
144144 if v not in '._+-' :
145145 try :
146146 v = int (v , 10 )
@@ -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
@@ -200,7 +201,7 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384):
200201 pos = 0
201202 while pos < len (binary ):
202203 if b'libc' in binary or b'GLIBC' in binary :
203- m = _libc_search .search (binary , pos )
204+ m = libc_search .search (binary , pos )
204205 else :
205206 m = None
206207 if not m or m .end () == len (binary ):
@@ -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,9 +293,13 @@ 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 ()
300- m = _ver_output .match (info )
302+ m = ver_output .match (info )
301303 if m is not None :
302304 system , release , version = m .groups ()
303305 # Strip trailing dots from version and release
@@ -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,10 +1066,17 @@ 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'
1082- match = _sys_version_parser .match (sys_version )
1079+ match = sys_version_parser .match (sys_version )
10831080 if match is None :
10841081 raise ValueError (
10851082 'failed to parse Jython sys.version: %s' %
@@ -1091,8 +1088,13 @@ 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"
1095- match = _pypy_sys_version_parser .match (sys_version )
1097+ match = pypy_sys_version_parser .match (sys_version )
10961098 if match is None :
10971099 raise ValueError ("failed to parse PyPy sys.version: %s" %
10981100 repr (sys_version ))
@@ -1101,7 +1103,7 @@ def _sys_version(sys_version=None):
11011103
11021104 else :
11031105 # CPython
1104- match = _sys_version_parser .match (sys_version )
1106+ match = sys_version_parser .match (sys_version )
11051107 if match is None :
11061108 raise ValueError (
11071109 'failed to parse CPython sys.version: %s' %
@@ -1290,13 +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"\\([\\\$\"\'`])" )
13001295# /etc takes precedence over /usr/lib
13011296_os_release_candidates = ("/etc/os-release" , "/usr/lib/os-release" )
13021297_os_release_cache = None
@@ -1311,10 +1306,18 @@ def _parse_os_release(lines):
13111306 "PRETTY_NAME" : "Linux" ,
13121307 }
13131308
1309+ # NAME=value with optional quotes (' or "). The regular expression is less
1310+ # strict than shell lexer, but that's ok.
1311+ os_release_line = re .compile (
1312+ "^(?P<name>[a-zA-Z0-9_]+)=(?P<quote>[\" \' ]?)(?P<value>.*)(?P=quote)$"
1313+ )
1314+ # unescape five special characters mentioned in the standard
1315+ os_release_unescape = re .compile (r"\\([\\\$\"\'`])" )
1316+
13141317 for line in lines :
1315- mo = _os_release_line .match (line )
1318+ mo = os_release_line .match (line )
13161319 if mo is not None :
1317- info [mo .group ('name' )] = _os_release_unescape .sub (
1320+ info [mo .group ('name' )] = os_release_unescape .sub (
13181321 r"\1" , mo .group ('value' )
13191322 )
13201323
0 commit comments