diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-04-18 09:11:53 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-04-18 09:11:53 (GMT) |
commit | 38148ea5f0ce9c76c4c75d89320f56795ae1e7ad (patch) | |
tree | 2d2e67b8305c79fef6a1a2ac6765fd4ba633703f | |
parent | 1efde679ce196730cf60fd61b9ac3bcbabfba35a (diff) | |
download | cpython-38148ea5f0ce9c76c4c75d89320f56795ae1e7ad.zip cpython-38148ea5f0ce9c76c4c75d89320f56795ae1e7ad.tar.gz cpython-38148ea5f0ce9c76c4c75d89320f56795ae1e7ad.tar.bz2 |
Merged revisions 80166 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r80166 | victor.stinner | 2010-04-18 11:07:49 +0200 (dim., 18 avril 2010) | 7 lines
platform: use subprocess.Popen() instead of os.popen() in _syscmd_file()
* Popen() avoids ugly shell escape: target.replace('"', '\\"')
* Use proc.communicate() instead of f.stdout.read()
* Get output from stdout by splitting with ": " instead of splitting by spaces
to support filename with spaces
........
-rwxr-xr-x | Lib/platform.py | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/Lib/platform.py b/Lib/platform.py index 1601d59..2801e8b 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -111,7 +111,7 @@ __copyright__ = """ __version__ = '1.0.7' -import sys, os, re +import sys, os, re, subprocess ### Globals & Constants @@ -942,13 +942,20 @@ def _syscmd_file(target,default=''): if sys.platform in ('dos','win32','win16','os2'): # XXX Others too ? return default - target = _follow_symlinks(target).replace('"', '\\"') + target = _follow_symlinks(target) try: - f = os.popen('file "%s" 2> %s' % (target, DEV_NULL)) + proc = subprocess.Popen( + ['file', target], + stdout=subprocess.PIPE, + stderr=open(DEV_NULL, 'wb')) except (AttributeError,os.error): return default - output = f.read().strip() - rc = f.close() + stdout, stderr = proc.communicate() + stdout = stdout.rstrip(b'\n\r') + # get output from "filename: output" + output = stdout.split(b': ', 1)[-1] + output = output.decode('ASCII') + rc = proc.wait() if not output or rc: return default else: @@ -964,8 +971,6 @@ _default_architecture = { 'dos': ('','MSDOS'), } -_architecture_split = re.compile(r'[\s,]').split - def architecture(executable=sys.executable,bits='',linkage=''): """ Queries the given executable (defaults to the Python interpreter @@ -1000,11 +1005,11 @@ def architecture(executable=sys.executable,bits='',linkage=''): # Get data from the 'file' system command if executable: - output = _syscmd_file(executable, '') + fileout = _syscmd_file(executable, '') else: - output = '' + fileout = '' - if not output and \ + if not fileout and \ executable == sys.executable: # "file" command did not return anything; we'll try to provide # some sensible defaults then... @@ -1016,9 +1021,6 @@ def architecture(executable=sys.executable,bits='',linkage=''): linkage = l return bits,linkage - # Split the output into a list of strings omitting the filename - fileout = _architecture_split(output)[1:] - if 'executable' not in fileout: # Format not supported return bits,linkage |