Как проверить, является ли файл исполняемым файлом macOS из Python? - PullRequest
0 голосов
/ 10 июля 2019

Например, учитывая:

$ cd /Applications/Xcode.app/Contents/MacOS
$ file Xcode
Xcode: Mach-O 64-bit executable x86_64

и

$ cd /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A
$ file IDEKit
IDEKit: Mach-O 64-bit dynamically linked shared library x86_64

Я хочу иметь возможность делать то, что делает file, в частности, чтобы проверить, является ли файл исполняемым или нет, но программно из Python.

Я знаю, что я мог бы вызвать команду file и проанализировать результат из Python, но есть ли лучший способ, который не требует вызова file?

Обратите внимание, что:

$ ls -l IDEKit
-rwxr-xr-x 1 root wheel 17256912 Apr  5 17:42 IDEKit*

и

$ ls -l Xcode
-rwxr-xr-x  1 root  wheel  44416 Apr 11 13:40 Xcode*

Т.е. они оба являются "исполняемыми" для битов разрешений файловой системы, но только Xcode является истинным исполняемым файлом.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Оказывается, что macholib позволяет вам читать и проверять заголовки Mach-O файла (если он есть) из Python. Так что код вроде:

def read_macho_headers( file ):
    try:
        return MachO.MachO( file ).headers
    except Exception:                   # not a Mach-O file
        return None

def is_macho_exe( macho_headers ):
    filetype = macho_headers[0].header.filetype
    return filetype == mach_o.MH_EXECUTE

будет работать.

0 голосов
/ 10 июля 2019

Вы можете использовать file-magic, которая является официальной привязкой Python для file.

После установки вы можете просто проверять файлы.

import magic

detected = magic.detect_from_filename('magic.py')
print 'Detected MIME type: {}'.format(detected.mime_type)
print 'Detected encoding: {}'.format(detected.encoding)
print 'Detected file type name: {}'.format(detected.name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...