Issue #9560: Use -b option of the file command in _syscmd_file()

Omit the filename to avoid enconding issues, especially with non encodable
characters in the Python full path.
This commit is contained in:
Victor Stinner 2010-08-13 16:30:15 +00:00
parent 3060c4573f
commit ddfb2c3a33
1 changed files with 6 additions and 12 deletions

View File

@ -990,9 +990,8 @@ def _syscmd_file(target,default=''):
""" Interface to the system's file command. """ Interface to the system's file command.
The function uses the -b option of the file command to have it The function uses the -b option of the file command to have it
ommit the filename in its output and if possible the -L option omit the filename in its output. Follow the symlinks. It returns
to have the command follow symlinks. It returns default in default in case the command should fail.
case the command should fail.
""" """
if sys.platform in ('dos','win32','win16','os2'): if sys.platform in ('dos','win32','win16','os2'):
@ -1000,7 +999,7 @@ def _syscmd_file(target,default=''):
return default return default
target = _follow_symlinks(target).replace('"', '\\"') target = _follow_symlinks(target).replace('"', '\\"')
try: try:
f = os.popen('file "%s" 2> %s' % (target, DEV_NULL)) f = os.popen('file -b "%s" 2> %s' % (target, DEV_NULL))
except (AttributeError,os.error): except (AttributeError,os.error):
return default return default
output = f.read().strip() output = f.read().strip()
@ -1020,8 +1019,6 @@ _default_architecture = {
'dos': ('','MSDOS'), 'dos': ('','MSDOS'),
} }
_architecture_split = re.compile(r'[\s,]').split
def architecture(executable=sys.executable,bits='',linkage=''): def architecture(executable=sys.executable,bits='',linkage=''):
""" Queries the given executable (defaults to the Python interpreter """ Queries the given executable (defaults to the Python interpreter
@ -1056,11 +1053,11 @@ def architecture(executable=sys.executable,bits='',linkage=''):
# Get data from the 'file' system command # Get data from the 'file' system command
if executable: if executable:
output = _syscmd_file(executable, '') fileout = _syscmd_file(executable, '')
else: else:
output = '' fileout = ''
if not output and \ if not fileout and \
executable == sys.executable: executable == sys.executable:
# "file" command did not return anything; we'll try to provide # "file" command did not return anything; we'll try to provide
# some sensible defaults then... # some sensible defaults then...
@ -1072,9 +1069,6 @@ def architecture(executable=sys.executable,bits='',linkage=''):
linkage = l linkage = l
return bits,linkage return bits,linkage
# Split the output into a list of strings omitting the filename
fileout = _architecture_split(output)[1:]
if 'executable' not in fileout: if 'executable' not in fileout:
# Format not supported # Format not supported
return bits,linkage return bits,linkage