LINUX.ORG.RU
решено ФорумTalks

определить тип файла на питоне

 , ,


0

1

На старости лет пришлось написать на питоне простенькое приложение.

гугление говорит, что родной mimetypes не очень и лучше использовать python-magic

«import magic» вызывает «ldconfig -p» чтоб найти какие-то либы...

окуеть!

Лучше бы я не трогал это обдолбаный шланг!

★★★★★
Ответ на: комментарий от Sahas

Да я уже закупил таблетки от изжоги и рвотные пакеты

vel ★★★★★
() автор топика
Ответ на: комментарий от th3m3

Оно работает. Я просто решил посмотреть как оно работает и слегка охренел.

Такого рукожопства я еще нигде не видел.

vel ★★★★★
() автор топика

вызывает «ldconfig -p»

Мне больше доставляет, когда в плагинах/модулях всякого сложного софта вместо API и нормальных языков (любых) используется баш и длиннющая колбаса из grep/sed/awk по выводу консольных утилит или sql-запроса. А я потом занимаюсь реверс-инжинирингом, потому что эта колбаса не учитывала какого-то случая, на который я напоролся.

yu-boot ★★★★★
()
Ответ на: комментарий от Aswed

ты про mimetypes ?

mimetypes.guess_type() выдает вполне вменяемые данные, но на SO была рекомендация использовать magic. Попробовал и удивился.

кстати, magic не смог опознать мелкомягкий файл, так что его использование отменяется.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

Ну проблема модуля mime в том, что он работает по названию файла. Т.е. если ты переименуешь clip.mp4 в clip.png, то mime его как png и опознает. Если у тебя не стоит задачи угадывать неправильно названные файлы, то mime пойдет. Ты собсна какую задачу пытаешься решить?

Aswed ★★★★★
()
Последнее исправление: Aswed (всего исправлений: 1)
Ответ на: комментарий от Aswed

Файл загружает через https?. Имя файла рандомное и ему нельзя доверять.

Мне нужно отсеить файлы которые явно не могут быть обработаны в либреоффисе

vel ★★★★★
() автор топика
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от skiminok1986

Растоманы идут лесом.

либреоффисе написан на питоне и тащить туда что-то еще не собираюсь.

vel ★★★★★
() автор топика

жабу сейчас можно канпелировать в бинарь поэтому это самый вариант для консольных аппок без боли

Syncro ★★★★★
()
Ответ на: комментарий от vel

mimetypes умеет по url определять тоже. Я бы воспользовался им. Т.к. твоя задача в том, что бы сделать грубый фильтр на входе, а magic хоть и будет работать более точно, битые файлы или несовместимые версии она не отсеит. Т.е. magic тут не будет полным решением, как и mimetypes. Однако mime будет работать быстрее(т.к. не читает хедеры) и меньше гемороя(не тащит за собой дополнительных .so-шек). Ты, конечно, можешь продолжить копаться с magic, но я бы посоветовал тебе все таки сначала попробовать пожить с mime.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

mimetypes.guess_type() на временный файл без расширения - вообще никак не работает.

пока остановился на magic.Magic(mime=False) - он выдает разультат идентичный file

vel ★★★★★
() автор топика

Пакетов magic с полдесятка. Лучший из них внутри просто вызывает консольный file, и даёт стринг его stdout. Имя пакета не помню, но с тем же успехом можно сделать простую обвязку для file самому.

olegd ★★★
()
Ответ на: комментарий от Syncro

жабу сейчас можно канпелировать в бинарь поэтому это самый вариант для консольных аппок без боли

Программы от задепрекейченного gjc собирать научилось?

olegd ★★★
()
Ответ на: комментарий от olegd

официальный graalvm собирает бинарники копеечного размера, есть фреймворки picocli и quarkus где все для того готовое

Syncro ★★★★★
()
Ответ на: комментарий от peregrine

Развели зоопарк...

vel ★★★★★
() автор топика
Ответ на: комментарий от skiminok1986

Внутренности LO меня не интересуют.

Интересует интерфейс с LO запущенного в виде сервера. Интерфейс к нему есть либо на жабе, либо на пыхтоне. Последний есть в виде одного скрипта, который не требует никаких дополнительных модулей.

vel ★★★★★
() автор топика
Ответ на: комментарий от Princesska

Никто ничего не должен.

И доверия этим данным нет.

vel ★★★★★
() автор топика

Тю, напиши функцию определения по сигнатуре. Че, не можешь считать первые пять-десять символов ?

windows10 ★★★★★
()

Пыхтон,.. есть же консольный file. Если очень надо к нему можно соорудить обертку на пыхтоне

cobold ★★★★★
()
Ответ на: комментарий от vel

Интересует интерфейс с LO запущенного в виде сервера.

Если это будет что-то нагруженное, то не рекомендую. Работает такое решение с пердежом и рвотой.

skiminok1986 ★★★★★
()
Ответ на: комментарий от vel

Чтобы что?

У либреофиса внутри неонка^W анализатор и думатель довольно нетривиальные как раз для определения того, что ему подсунули и как с подсунутым поступить.

Наслаждайся: https://kohei.us/2012/05/21/what-goes-on-when-loading-a-file/

frob ★★★★★
()
Ответ на: комментарий от vel

Есть другие открытые решения?

На пайтоне есть либы для работы с OOXML. Правда тянут за собой достаточно много всякого и не всегда работают корректно, но по крайней мере позволяют эффективнее использовать ресурсы и не плясать с бубном вокруг LO на сервере.

skiminok1986 ★★★★★
()
Ответ на: комментарий от skiminok1986

Про «другие решения» я имел ввиду способы преобразования документов в pdf.

На пайтоне есть либы для работы с OOXML. Правда тянут за собой достаточно много всякого и не всегда работают корректно, но по крайней мере позволяют эффективнее использовать ресурсы и не плясать с бубном вокруг LO на сервере.

Все это запихнуто в LO. Почему бы им не воспользоваться? Производительность низкая, но запуск на каждый документ LO - еще медленнее (а в bigbluebutton оно еще через докер запускается).

у меня на входе кроме .odt есть еще разное барахло типа .rtf, .ppt[x], doc[x]

Так что кроме LO или ОО я пока других работоспособных открытых решений не вижу.

Пока мне пришлось написать 1 скрипт который по http получает файл, скармиливает его LO и отдает ответ. Плюс 2 файла для старта сервисов. Я считаю это приемлемым решением.

vel ★★★★★
() автор топика
Ответ на: комментарий от upcFrost

Да ты капитан очевидность :)

odt, odp, docx, pptx - zip-архивы.

Есть подозрение, что успешность определяемости формата зависит от порядка файлов в архиве.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

кстати, magic не смог опознать мелкомягкий файл, так что его использование отменяет

magic - это потенциальная дыра. Там были проблемы с переполением + выполнением кода. Зря ты вообще всё это начал.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от vel

Удивительно, libmagic работает как libmagic.

Только я не понял, о чем вообще тред? Как в других языках сделана работа с libmagic?

leave ★★★★★
()
Ответ на: комментарий от Aswed

Т.е. если ты переименуешь clip.mp4 в clip.png, то mime его как png и опознает.

srsly? O_o кэп-функция? Хотя можно еще круче, чтоб возвращала одно значение it’s a file, bro!

Anoxemian ★★★★★
()
Ответ на: комментарий от vel

mimetypes.guess_type() на временный файл без расширения - вообще никак не работает.

Guess the type of a file based on its filename, path or URL,

Ну потому что ман надо читать. Оно натурально определяет «по имени файла»

Вообще по опыту со 100% гарантией определить тип невозможно вообще, раржипег тому живой пример. Максимум по сигнатуре можно глянуть, но это не панацея (тот же раржипег опять же пример)

upcFrost ★★★★★
()

«import magic» вызывает «ldconfig -p» чтоб найти какие-то либы…

Абсолютно очевидно что ему нужна libmagic. Абсолютно очевидно что нужно найти саму сошку. Вполне логично делать это через системный динамический линкер. И механизм это, к слову, не из python-magic, а из стандартных питоновских ctypes.

Итак, что конкретно тебя не устраивает?

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от leave

В нормальных реализациях модуль слинкован с libmagic, а не ищет ее вызовом «ldconfig -p»

Мантейнер python-magic знает о зависимости от libmagic. Нахрена его искать?

А что, в питоне нет «бинарных» модулей, которые компилируются с использование разделяемых библиотек?

vel ★★★★★
() автор топика
Ответ на: комментарий от crutch_master

посмотри на CVE у libmagic и LO

использование libmagic не ухудшит общую безопасность и при этом позволит отбросить левые файлы.

В следующем приступе паранойи можно добавить проверку антивирусом полученого файла.

В большинстве случаев у меня на входе content-type application/octet-stream и имя файла в виде хеша

vel ★★★★★
() автор топика
Ответ на: комментарий от leave

Вау! Даже так!?

egg, pip, wheel.

Господи! Зачем я тронул этот шланг! 27 лет я старательно обходил его стороной.

Я уже ничего не хочу. Моя поделка работает. Но знакомство с потрохами питона ввело меня в уныние.

vel ★★★★★
() автор топика
Ответ на: комментарий от vel

Ну так это не «потроха», это инфраструктура языка. wheel это стандарт де-факто последние лет 10, наверное.

https://stackoverflow.com/questions/2051192/what-is-a-python-egg

https://packaging.python.org/en/latest/discussions/wheel-vs-egg/

По сравнению с миром сишечки/крестов или там жабки в бидоне все просто прекрасно. По сравнению с гемами тоже все ништяк. cpan тоже во все поля компилирует биндинги. Пыховский композер - ад и холокост. npm - лучше просто промолчим. Кароч, где прям намного лучше-то?

leave ★★★★★
()
Ответ на: комментарий от vel

посмотри на CVE у libmagic и LO

LO тут притом, что?

CVE у libmagic

Тау у libmagic нет и никогда не было уязвимостей?

использование libmagic не ухудшит общую безопасность

У тебя юзается доп.хрень, которую уже имели в шели. Ну да, если у тебя вся система из такой херни, то уже уже не сделаешь.

В следующем приступе паранойи можно добавить проверку антивирусом

У тебя libmagic может протечь в память и что-то там выполнить, понимаешь? Чем тебе поможет антивирус, лол?

crutch_master ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.