[Python-checkins] r80167 - in python/branches/py3k: Lib/platform.py

victor.stinner python-checkins at python.org
Sun Apr 18 11:11:53 CEST 2010


Author: victor.stinner
Date: Sun Apr 18 11:11:53 2010
New Revision: 80167

Log:
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
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/platform.py

Modified: python/branches/py3k/Lib/platform.py
==============================================================================
--- python/branches/py3k/Lib/platform.py	(original)
+++ python/branches/py3k/Lib/platform.py	Sun Apr 18 11:11:53 2010
@@ -111,7 +111,7 @@
 
 __version__ = '1.0.7'
 
-import sys, os, re
+import sys, os, re, subprocess
 
 ### Globals & Constants
 
@@ -942,13 +942,20 @@
     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 @@
     '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 @@
 
     # 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 @@
                 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


More information about the Python-checkins mailing list