我正在尝试在Alpine Linux上使用file-magic,并且AttributeError: Symbol not found: magic_open
每当导入magic
模块时,它就会不断崩溃。
我注意到那里有两个具有相同magic
名称空间的Python模块,但是由于大多数Linux发行版似乎都在使用file-magic
而不是python-magic
,我决定让我的模块依赖于前者。但是,在Alpine上,仅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
安装文件魔术:
/ # 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
>>>
交换文件魔术为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容器以处理文件魔术?在这种情况下正确的做法是什么?
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句