From 0af9c33262fb43f39a6558e3f155689e83e10706 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 17 Dec 2018 18:47:24 +0100 Subject: bpo-35348: Fix platform.architecture() (GH-11159) 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 --- Lib/platform.py | 16 ++++++++++++---- .../Library/2018-12-14-13-27-45.bpo-35348.u3Y2an.rst | 3 +++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-12-14-13-27-45.bpo-35348.u3Y2an.rst diff --git a/Lib/platform.py b/Lib/platform.py index 0fe841c..9dd3f47 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -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 index 0000000..190db31 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-14-13-27-45.bpo-35348.u3Y2an.rst @@ -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. -- cgit v0.12