paradox81ru
Янв. 11, 2020 12:17:09
Добрый всем день!
У меня вот какая проблема. Я создаю свой сайт, на Django, разрабатываю его на Виндах, потом готовый результат сбрасываю на рабочий сервер, расположенный на Ubuntu 18, сервер свой, настраивал сам. В качестве Питона использую версию 3.7, всю работу с Django организовал в своей виртуальной среде. Все настройки старался делать аналогично и на Виндах и на Линуксе, чтобы потом менее проблемно было переносить сайт из разработки в работу. Для сайта мне в какой-то момент понадобилась работа с шифрованием, для этого я подключил пакет Cryptodome. Из этого пакета я использовал функцию хеширования SHA512 и шифрования RSA. На Виндах я все сделал, работает нормально. Но при переносе рабочего кода на Линукс возникла проблема. Дело в том, что на Ubuntu 18 изначальная версия третьего Питона 3.6, и я так по умолчанию и оставил. А для работы установил питон 3.7 и соответствующее виртуальное окружение. Но сайт в продакшене в общем-то нормально работал, пока я не скинул туда код с импортом пакета Cryptodome.Hash.SHA512. После этого, когда я запускаю сайт на Ubuntu, возникает ошибка:
Cannot load native module ‘Cryptodome.Hash._SHA512’: Trying ‘_SHA512.cpython-36m-x86_64-linux-gnu.so’: /var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/Cryptodome/Util/../Hash/_SHA512.cpython-36m-x86_64-linux-gnu.so: cannot open shared object file: No such file or directory, Trying ‘_SHA512.abi3.so’: /var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/Cryptodome/Util/../Hash/_SHA512.abi3.so: cannot open shared object file: No such file or directory, Trying ‘_SHA512.so’: /var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/Cryptodome/Util/../Hash/_SHA512.so: cannot open shared object file: No such file or directory
Как видно из текста ошибки, происходит попытка загрузить модуль "_SHA512.cpython-36m-x86_64-linux-gnu.so“, которого разумеется нет, так как в пакете Cryptodome для питона 3.7 находиться модуль ”_SHA512.cpython-37m-x86_64-linux-gnu.so“, скомпилированный соответственно для работы именно с Питоном 3.7. Я не могу понять, почему он пытается загрузить модуль для другой версии питона? Пройдясь по коду, я нашел, что за загрузку библиотеки отвечает модуль ”_raw_api.py“ расположенный в ”venv3.7\Lib\site-packages\Cryptodome\Util“. В этом модуле, для установки нужного суфикса (cpython-36m-x86_64-linux-gnu.so или cp37-win32 или соответственно нужного мне cpython-37m-x86_64-linux-gnu.so) отвечает переменная ”EXTENSION_SUFFIXES" из модуля importlib.machinery каким-то образом инициализирующая там список суфиксов, который потом добавляется к имени модуля "_SHA512". И вот тут дальше я уже никуда пройти не могу, потому что работу модуля machinery мне никак не отследить, и по какому принципу он формирует список суфиксов, а точнее, почему он в этот список добавляет именно строку "cpython-36m-x86_64-linux-gnu“, а не ”cpython-37m-x86_64-linux-gnu", я понять никак не могу. Кстати, из этого же пакета Cryptodome модуль RSA он вроде как нормально импортирует, без ошибок. Но вот SHA512 никак не хочет импортировать. Может кто подскажет в чем проблема, или в какую еще сторону стоит копать, для поиска истины? Еще прошу Вас учитывать, что я далеко не профессионал в Линуксах, поэтому не очень ругайтесь, если я буду подтупливать по вопросам работы в Ubuntu.
paradox81ru
Янв. 11, 2020 14:19:21
Вот еще, нашел интересный лог сервера apache. Стало понятно, откуда берется префикс для Питона 3.6.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/core/handlers/wsgi.py”, line 141, in __call__
response = self.get_response(request)
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/core/handlers/base.py”, line 75, in get_response
response = self._middleware_chain(request)
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/core/handlers/exception.py”, line 36, in inner
response = response_for_exception(request, exc)
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/core/handlers/exception.py”, line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/core/handlers/exception.py”, line 128, in handle_uncaught_exception
callback, param_dict = resolver.resolve_error_handler(500)
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/urls/resolvers.py”, line 597, in resolve_error_handler
callback = getattr(self.urlconf_module, ‘handler%s’ % view_type, None)
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/utils/functional.py”, line 80, in __get__
res = instance.__dict__ = self.func(instance)
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/urls/resolvers.py”, line 577, in urlconf_module
return import_module(self.urlconf_name)
File “/usr/lib/python3.6/importlib/__init__.py”, line 126, in import_module
return _bootstrap._gcd_import(name, package, level)
File “<frozen importlib._bootstrap>”, line 994, in _gcd_import
File “<frozen importlib._bootstrap>”, line 971, in _find_and_load
File “<frozen importlib._bootstrap>”, line 955, in _find_and_load_unlocked
File “<frozen importlib._bootstrap>”, line 665, in _load_unlocked
File “<frozen importlib._bootstrap_external>”, line 678, in exec_module
File “<frozen importlib._bootstrap>”, line 219, in _call_with_frames_removed
File “/var/pyprojects/MySite/MySite/urls.py”, line 63, in <module>
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/django/urls/conf.py”, line 34, in include
urlconf_module = import_module(urlconf_module)
File “/usr/lib/python3.6/importlib/__init__.py”, line 126, in import_module
return _bootstrap._gcd_import(name, package, level)
File “<frozen importlib._bootstrap>”, line 994, in _gcd_import
File “<frozen importlib._bootstrap>”, line 971, in _find_and_load
File “<frozen importlib._bootstrap>”, line 955, in _find_and_load_unlocked
File “<frozen importlib._bootstrap>”, line 665, in _load_unlocked
File “<frozen importlib._bootstrap_external>”, line 678, in exec_module
File “<frozen importlib._bootstrap>”, line 219, in _call_with_frames_removed
File “/var/pyprojects/MySite/test_polygon/urls.py”, line 2, in <module>
from test_polygon.views import *
File “/var/pyprojects/MySite/test_polygon/views.py”, line 1, in <module>
from Cryptodome.Hash import SHA512
File “/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/Cryptodome/Hash/SHA512.py”, line 48, in <module>
“”“)
File ”/var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/Cryptodome/Util/_raw_api.py“, line 299, in load_pycryptodome_raw_lib
raise OSError(”Cannot load native module ‘%s’: %s“ % (name, ”, ".join(attempts)))
OSError: Cannot load native module ‘Cryptodome.Hash._SHA512’: Trying ‘_SHA512.cpython-36m-x86_64-linux-gnu.so’: /var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/Cryptodome/Util/../Hash/_SHA512.cpython-36m-x86_64-linux-gnu.so: cannot open shared object file: No such file or directory, Trying ‘_SHA512.abi3.so’: /var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/Cryptodome/Util/../Hash/_SHA512.abi3.so: cannot open shared object file: No such file or directory, Trying ‘_SHA512.so’: /var/pyprojects/venvs/venv3.7/lib/python3.7/site-packages/Cryptodome/Util/../Hash/_SHA512.so: cannot open shared object file: No such file or directory
Действительно модуль importlib почему-то импортируется из питона 3.6. Хотя, я пробовал на Линксе вручную открывать компилятор Питона 3.7, и тем же пакетом хешировать строки. Все работает, никаких ошибок. Но на сайте не дает даже произвести импорт Cryptodome.Hash.SHA512, сразу появляется ошибка.
paradox81ru
Янв. 13, 2020 07:14:34
Проблема решена, тема закрыта.
Rodegast
Янв. 13, 2020 10:05:45
> всю работу с Django организовал в своей виртуальной среде.
Сколько раз не говори людям что бы этой шнягой не пользовались, но они продолжают есть кактус…