Как заставить файл-волшебный модуль работать на Alpine Linux?
Я пытаюсь использовать магию файлов в Alpine Linux, и она продолжает взрываться AttributeError: Symbol not found: magic_open
всякий раз, когда я импортирую magic
модуль.
Я заметил, что есть два модуля Python с одинаковыми magic
пространство имен, но, как представляется, большинство дистрибутивов Linux используют file-magic
и не python-magic
Я решил сделать свой модуль зависимым от первого. Однако на альпийском только python-magic
Похоже на работу:
Настройте Alpine и установите libmagic:
$ docker run --rm -it python:3-alpine /bin/sh
/ # apk add libmagic
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/1) Installing libmagic (5.32-r0)
OK: 21 MiB in 35 packages
Установите файл-magic:
/ # pip install file-magic
Collecting file-magic
Downloading https://files.pythonhosted.org/packages/bb/7e/b256e53a6558afd348387c3119dc4a1e3003d36030584a427168c8d72a7a/file_magic-0.4.0-py3-none-any.whl
Installing collected packages: file-magic
Successfully installed file-magic-0.4.0
Это не работает, хотя:
/ # python
Python 3.7.1 (default, Dec 21 2018, 03:21:42)
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import magic
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/magic.py", line 61, in <module>
_open = _libraries['magic'].magic_open
File "/usr/local/lib/python3.7/ctypes/__init__.py", line 369, in __getattr__
func = self.__getitem__(name)
File "/usr/local/lib/python3.7/ctypes/__init__.py", line 374, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: Symbol not found: magic_open
>>>
Поменяйте файл-magic на python-magic:
$ pip uninstall file-magic
Uninstalling file-magic-0.4.0:
Would remove:
/usr/local/lib/python3.7/site-packages/file_magic-0.4.0.dist-info/*
/usr/local/lib/python3.7/site-packages/magic.py
Proceed (y/n)? y
Successfully uninstalled file-magic-0.4.0
/ # pip install python-magic
Collecting python-magic
Downloading https://files.pythonhosted.org/packages/42/a1/76d30c79992e3750dac6790ce16f056f870d368ba142f83f75f694d93001/python_magic-0.4.15-py2.py3-none-any.whl
Installing collected packages: python-magic
Successfully installed python-magic-0.4.15
Оно работает:
/ # python
Python 3.7.1 (default, Dec 21 2018, 03:21:42)
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import magic
>>>
Я понимаю, что в каждом дистрибутиве есть свои причуды, и я хочу учесть их, но сейчас я просто не знаю, как это сделать. Есть ли способ определить файл setup.py модуля, чтобы обойти эту ситуацию? Есть ли способ настроить контейнер Docker для работы с file-magic? Что правильно делать в этом случае?
3 ответа
Python-Magic имеет жестко запрограммированный запасной вариант для Alpine Linux, так что вы можете столкнуться с трудностями в работе с file-magic, которая просто использует ctypes.util.find_library('magic')
и, видимо, не могу найти вашу библиотеку.
Точное поведение ctypes.util.find_library
это довольно сложно, но если вы проследите код и увидите, какие методы он пытается использовать на вашей платформе, вы, вероятно, найдете способ найти его (возможно, один из gcc
, /sbin/ldconfig
, или же objdump
).
Другое решение заключается в исправлении ctypes.py
для правильной работы с такими системами, как Alpine:
wget https://patch-diff.githubusercontent.com/raw/python/cpython/pull/10461.patch -O - | patch /usr/local/lib/python3.7/ctypes/util.py
Теперь вам просто нужно установить LD_LIBRARY_PATH
и Python может найти библиотеку:
/ # LD_LIBRARY_PATH="/usr/lib/" python -c "import ctypes.util; print(ctypes.util.find_library('magic'))"
libmagic.so.1
apk update && apk add -y --no-install-recommends --no-cache libmagic
работал у меня.
Вам нужно поместить это в образ докера.
Другое решение мне не помогло Docker Python 2.7 Alpine
Решение - переименовать файл :)
# fix no libmagic found error
RUN cp /usr/lib/libmagic.so.1 /usr/lib/libmagic.so