]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35348: Fix platform.architecture() (GH-11159)
authorVictor Stinner <vstinner@redhat.com>
Mon, 17 Dec 2018 17:47:24 +0000 (18:47 +0100)
committerGitHub <noreply@github.com>
Mon, 17 Dec 2018 17:47:24 +0000 (18:47 +0100)
Make platform.architecture() parsing of "file" command output more
reliable:

* Add the "-b" option to the "file" command to omit the filename;
* Force the usage of the C locale;
* Search also the "shared object" pattern.

Co-Authored-By: Serhiy Storchaka <storchaka@gmail.com>
Lib/platform.py
Misc/NEWS.d/next/Library/2018-12-14-13-27-45.bpo-35348.u3Y2an.rst [new file with mode: 0644]

index 0fe841c71ce675eef09fbac46699df62f41ebf4e..9dd3f47075bf70fb0d553a1ebddec3067b34edb9 100755 (executable)
@@ -608,13 +608,21 @@ def _syscmd_file(target, default=''):
 
     import subprocess
     target = _follow_symlinks(target)
+    # "file" output is locale dependent: force the usage of the C locale
+    # to get deterministic behavior.
+    env = dict(os.environ, LC_ALL='C')
     try:
-        output = subprocess.check_output(['file', target],
+        # -b: do not prepend filenames to output lines (brief mode)
+        output = subprocess.check_output(['file', '-b', target],
                                          stderr=subprocess.DEVNULL,
-                                         encoding='latin-1')
+                                         env=env)
     except (OSError, subprocess.CalledProcessError):
         return default
-    return (output or default)
+    if not output:
+        return default
+    # With the C locale, the output should be mostly ASCII-compatible.
+    # Decode from Latin-1 to prevent Unicode decode error.
+    return output.decode('latin-1')
 
 ### Information about the used architecture
 
@@ -672,7 +680,7 @@ def architecture(executable=sys.executable, bits='', linkage=''):
                 linkage = l
         return bits, linkage
 
-    if 'executable' not in fileout:
+    if 'executable' not in fileout and 'shared object' not in fileout:
         # Format not supported
         return bits, linkage
 
diff --git a/Misc/NEWS.d/next/Library/2018-12-14-13-27-45.bpo-35348.u3Y2an.rst b/Misc/NEWS.d/next/Library/2018-12-14-13-27-45.bpo-35348.u3Y2an.rst
new file mode 100644 (file)
index 0000000..190db31
--- /dev/null
@@ -0,0 +1,3 @@
+Make :func:`platform.architecture` parsing of ``file`` command output more
+reliable: add the ``-b`` option to the ``file`` command to omit the filename,
+force the usage of the C locale, and search also the "shared object" pattern.