Commit 0af9c332 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

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: default avatarSerhiy Storchaka <storchaka@gmail.com>
parent 94cf308e
...@@ -608,13 +608,21 @@ def _syscmd_file(target, default=''): ...@@ -608,13 +608,21 @@ def _syscmd_file(target, default=''):
import subprocess import subprocess
target = _follow_symlinks(target) 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: 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, stderr=subprocess.DEVNULL,
encoding='latin-1') env=env)
except (OSError, subprocess.CalledProcessError): except (OSError, subprocess.CalledProcessError):
return default 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 ### Information about the used architecture
...@@ -672,7 +680,7 @@ def architecture(executable=sys.executable, bits='', linkage=''): ...@@ -672,7 +680,7 @@ def architecture(executable=sys.executable, bits='', linkage=''):
linkage = l linkage = l
return bits, linkage return bits, linkage
if 'executable' not in fileout: if 'executable' not in fileout and 'shared object' not in fileout:
# Format not supported # Format not supported
return bits, linkage return bits, linkage
......
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.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment