LINUX.ORG.RU

pyunpack и uwsgi

 , ,


1

1

Пишу приложение на Django. Есть необходимость подгрузить файл формата CAB и распаковать его. Распаковка посредством pyunpack:

# views.py
from pyunpack import Archive
...
def upload_cab(request):
    ...
    try:
        Archive(filename).extractall(extract_path)
    except Exception as e:
        raise e

Код нормально работает в PyCharm, но на тестовом сервере (CentOS 7, uwsgi+Nginx) в e падает ошибка:

patool can not unpack /usr/sbin/uwsgi: unrecognized option '--non-interactive' getopt_long() error

Ошибка одна и та же как в случае uwsgi установленном через yum, так и через pip. В лог uwsgi (опция logto в uwsgi.ini) никаких ошибок не падает.

Так же в этом же проекте добавил консольную опцию к manage.py (через management.commands), где используется аналогичный код — проблем нет, архив распаковывается. Т.е. проблему локализовал до uwsgi.


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

Я догадался, что pyunpack через системный вызов дёргает с некоторыми опциями patool и uwsgi не понимает этих опций. Т.к. я раньше с uwsgi никогда дел не имел, то с большой долей вероятности просто упустил какой-то хак для таких случаев.

zipfile не работает с CAB-файлами, поэтому не вариант. Но после Вашей подсказки я набрёл на cabfile, который раньше упустил из виду. Судя по исходникам у него нет зависимостей от внешних утилит, буду пробовать его.

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

Короче, я выяснил, что в sys.executable должен быть путь к интерпретару питона, но так как скрипт запускается из под uwsgi, он встаёт вместо него. Может быть в uwsgi и есть какая-нибудь опция для этого, не смог найти. Как временное решение, можно вручную изменить значение sys.executable перед распаковкой, а потом вернуть обратно.

Kilte ★★★★★
()

Не с целью наброса, а исключительно для констатации факта — решил вопрос заменой uWSGI на Gunicorn.

Число пакетов для работы с CAB-файлами в Python можно пересчитать по пальцам одной руки: сабжевый pyunpack, недокументированный и со сломанным extract-методом pycab, windows-only cabfile, вот собственно и всё.

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

Библиотека от бога: pyunpack пускает через шелл пистон прогу patool, которая для распаковки cab дергает через шелл cabextract.

И ТС меняет uwsgi на unicron из-за этого.

Дух ЛОРа здесь.

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

Библиотека от бога: pyunpack пускает через шелл пистон прогу patool, которая для распаковки cab дергает через шелл cabextract.

Это пять! Тут скорее дух питонокодеров.

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

Число пакетов для работы с CAB-файлами в Python можно пересчитать по пальцам одной руки

А чем другие не устроили? Я вроде нагуглил что-то не костыльное. В конце-концов всегда можно самому написать или тот же cabextract дёрнуть. Менять сервер из-за этого мягко говоря странно.

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

А чем другие не устроили?

Как я уже отписался выше, zipfile не умеет работать с CAB-архивами. Я нашёл пару других пакетов, но не стал/не смог их использовать по причинам описанным выше. Я не знаю, что там нагуглили Вы, я видел только предложение использовать zipfile.

тот же cabextract дёрнуть

А есть принципиальная разница дёрну я кабэкстракт сам или pyunpack дёрнет его для меня?

Менять сервер из-за этого мягко говоря странно.

Есть проблема и есть срок её решения. Есть сервер, на котором эта проблема есть, и сервер, на котором, как оказалось, этой проблемы нет. Я задачу решил, заказчик доволен. В теме отписался, чтобы здесь было хоть какое-то решение, без цели и желания задеть чьи-то религиозные чувства.

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

А есть принципиальная разница дёрну я кабэкстракт сам или pyunpack дёрнет его для меня?

Так там же целая цепочка без какой-либо пользы (тут выше писали), одни только накладные расходы. А написать самому функцию-обёртку над вызовом cabextract займёт гораздо меньше времени, чем сменить сервер.

Число пакетов для работы с CAB-файлами в Python можно пересчитать по пальцам одной руки: сабжевый pyunpack, недокументированный и со сломанным extract-методом pycab, windows-only cabfile, вот собственно и всё.

А вот эта штука не подходит? https://github.com/hughsie/python-cabarchive

В теме отписался, чтобы здесь было хоть какое-то решение, без цели и желания задеть чьи-то религиозные чувства.

Ну а я отписался, чтобы предложить более вменяемое решение.

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

А вот эта штука не подходит?

Не знал о ней. Не подходит — падает с ошибкой в 210 строке при попытке использовать zlib для распаковки:

File "/tmp/python-cabarchive-master/cabarchive/archive.py", line 210, in _parse_cfdata
    raise CorruptionError('Failed to decompress: ' + str(e))
cabarchive.errors.CorruptionError: Failed to decompress: Error -3 while decompressing: invalid distance too far back
ivn86
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.