Ctypes

У PHP есть модуль из которого можно «дёрнуть» любую dll/so. Следовало ожидать, что и у Python есть что-то подобное. Это что-то подобное называется ctypes. Я попробовал реализовать небольшой модуль, который обращается к библиотеке libmagic (которая занимается определением типа файла по его сигнатуре).

Вот что получилось (finfo.py):
# -*- coding: utf8 -*-

from ctypes import *

NONE = 0 #  No special handling
DEBUG = 1 # Print debugging messages to stderr
SYMLINK = 2 # If the file queried is a symlink, follow it
COMPRESS = 4 #  If the file is compressed, unpack it and look at the contents
DEVICES  = 8 #  If the file is a block or character special device, then open the device and try to look in its content
MIME = 16 # Return a mime string, instead of a textual description
CONTINUE = 32 #  Return all matches, not just the first
CHECK = 64 # Check the magic database for consistency and print warnings to stderr
PRESERVE_ATIME = 128 # On systems that support utime(2) or utimes(2), attempt to preserve the access time of files analyzed
RAW = 256 #  Don’t translate unprintable characters to a ooo octal representation.

class finfo:
    def __init__(self, magicfile = None, flag = NONE):
        """Инициализация. Передаются имя magic-файла (или используется размещение
        по умолчанию и флаги (см. константы выше)"""

        self.lib = cdll.LoadLibrary('libmagic.so.1')

        # следующие функции возвращают указатель на char, что я указываю
        self.lib.magic_buffer.restype = c_char_p
        self.lib.magic_file.restype = c_char_p
        self.lib.error.restype = c_char_p

        self.magic = self.lib.magic_open(flag)
        self.lib.magic_load(self.magic, magicfile)

    def buffer(self, content):
        """определить содержимое из строки"""
        return self.lib.magic_buffer(self.magic, content, len(content))

    def file(self, filename):
        """определить содержимое файла"""
        return self.lib.magic_file(self.magic, filename)

    def __del__(self):
        self.lib.magic_close(self.magic)
Вызывается модуль просто:
import finfo

mime = finfo.finfo('/usr/share/file/magic', finfo.MIME)
print mime.file('more.png')
9 декабря 2008 18:21

ninjacolumbo.ya.ru (ninjacolumbo.ya.ru)
9 декабря 2008, 19:30

 """опеределить содержимое файла"""

bolk (bolknote.ru)
9 декабря 2008, 20:20, ответ предназначен ninjacolumbo.ya.ru:

Спасибо, поправил.

yourbunnywrite.ya.ru (yourbunnywrite.ya.ru)
9 декабря 2008, 20:39, ответ предназначен bolk (bolknote.ru):

а как в php такой модуль называется ?

bolk (bolknote.ru)
9 декабря 2008, 21:17, ответ предназначен yourbunnywrite.ya.ru:

В PHP5 — ffi (http://cvs.php.net/viewvc.cgi/pecl/ffi/), но документирован он очень плохо. В Windows можно использоваться win32api (http://www.php.net/manual/en/book.w32api.php). В PHP4 был другой модуль, его название я сходу и не вспомню, да и, наверное, не актуально, надо использовать PHP5.

zencd.livejournal.com (zencd.livejournal.com)
9 декабря 2008, 23:54

Сколько помню, у этих эс-ошек всегда «.1» на конце. В чём смысл?

На версию не очень похоже.

playpausenstop.livejournal.com (playpausenstop.livejournal.com)
10 декабря 2008, 00:41

import mimetypes не спасут отца русской демократии? или просто для попробовать сие реализовывалось?

bolk (bolknote.ru)
10 декабря 2008, 09:23, ответ предназначен zencd.livejournal.com:

Версия и есть.

bolk (bolknote.ru)
10 декабря 2008, 09:25, ответ предназначен playpausenstop.livejournal.com:

Задача совершенно другая — вызывать другую, большую библиотеку. Это тренировка.

А, кроме того, разве mimetypes говорит тип файла не по разрешению?

bolk (bolknote.ru)
10 декабря 2008, 09:46, ответ предназначен zencd.livejournal.com:

Там не всегда «.1»:

-rwxr-xr-x 1 root root 11580 2007-12-12 23:33 libuuid.so.1.2
lrwxrwxrwx 1 root root 22 2008-02-06 22:03 libvolume_id.so.0 -> libvolume_id.so.0.82.0
-rwxr-xr-x 1 root root 44960 2008-01-10 19:00 libvolume_id.so.0.82.0

для того, чтобы не заморачиваться с версиями, в библитеке есть специальный вызов, который по короткому имени (без «lib», «.so» и номера) ищет полное имя библиотеки.

bolk (bolknote.ru)
10 декабря 2008, 09:47, ответ предназначен playpausenstop.livejournal.com:

Тьфу ты. С утра вместо «расширения», «разрешение» написал :)

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)