summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-04-18 09:11:53 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-04-18 09:11:53 (GMT)
commit38148ea5f0ce9c76c4c75d89320f56795ae1e7ad (patch)
tree2d2e67b8305c79fef6a1a2ac6765fd4ba633703f
parent1efde679ce196730cf60fd61b9ac3bcbabfba35a (diff)
downloadcpython-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-xLib/platform.py28
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