6 votes

AttributeError exécutant un site Django sur Mac 11.0.1

J'obtiens une erreur en exécutant localement un site django qui fonctionnait bien avant que je mette à jour mon Mac OS en 11.0.1. Je pense que cette mise à jour est à l'origine du problème puisque rien d'autre n'a été modifié entre le moment où il fonctionnait et maintenant.

10:15:05 worker.1 | Traceback (most recent call last):
10:15:05 worker.1 |   File "/usr/local/bin/celery", line 5, in <module>
10:15:05 worker.1 |     from celery.__main__ import main
10:15:05 worker.1 |   File "/usr/local/lib/python2.7/site-packages/celery/__init__.py", line 133, in <module>
10:15:05 worker.1 |     from celery import five  # noqa
10:15:05 worker.1 |   File "/usr/local/lib/python2.7/site-packages/celery/five.py", line 20, in <module>
10:15:05 worker.1 |     from kombu.five import monotonic
10:15:05 worker.1 |   File "/usr/local/lib/python2.7/site-packages/kombu/five.py", line 56, in <module>
10:15:05 worker.1 |     absolute_to_nanoseconds = CoreServices.AbsoluteToNanoseconds
10:15:05 worker.1 |   File "/usr/local/Cellar/python@2/2.7.17_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 379, in __getattr__
10:15:05 worker.1 |     func = self.__getitem__(name)
10:15:05 worker.1 |   File "/usr/local/Cellar/python@2/2.7.17_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 384, in __getitem__
10:15:05 worker.1 |     func = self._FuncPtr((name_or_ordinal, self))
10:15:05 worker.1 | AttributeError: dlsym(RTLD_DEFAULT, AbsoluteToNanoseconds): symbol not found

Voici ma configuration de brassage

HOMEBREW_VERSION: 2.6.0
ORIGIN: https://github.com/Homebrew/brew
HEAD: 1d5e354cc2ff048bd7161d95b3fa7f91dc9dd081
Last commit: 2 days ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: fdb83fcfb482e5ed1f1c3c442a85b99223fcabeb
Core tap last commit: 27 hours ago
Core tap branch: master
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CASK_OPTS: []
HOMEBREW_DISPLAY: /private/tmp/com.apple.launchd.rZ1F30XomO/org.macosforge.xquartz:0
HOMEBREW_MAKE_JOBS: 8
Homebrew Ruby: 2.6.3 => /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby
CPU: octa-core 64-bit icelake
Clang: 12.0 build 1200
Git: 2.24.3 => /Applications/Xcode-beta.app/Contents/Developer/usr/bin/git
Curl: 7.64.1 => /usr/bin/curl
Java: 14.0.2, 1.8.0_265
macOS: 11.0.1-x86_64
CLT: 12.3.0.0.1.1605054730
Xcode: 12.3 => /Applications/Xcode-beta.app/Contents/Developer
XQuartz: 2.7.11 => /opt/X11

En général, j'exécute le site avec un virtualenv exécutant python 2.7.15. J'ai obtenu la même erreur avec cela. J'ai réinstallé python avec pyenv et refait le virtualenv mais la même erreur est apparue. J'utilise Django 1.10.8 avec Kombu 3.0.37.

26voto

ezdookie Points 917

Ok, c'est une sale solution de rechange pour la compatibilité avec Big Sur :

https://developer.apple.com/documentation/macos-release-notes/macos-big-sur-11_0_1-release-notes

Nouveauté de macOS Big Sur 11.0.1, le système est livré avec un cache intégré d'éditeur de liens dynamiques de toutes les bibliothèques fournies par le système. dynamique intégré de toutes les bibliothèques fournies par le système. Dans le cadre de ce changement, les copies des bibliothèques dynamiques ne sont plus présentes sur le système de fichiers. Le code qui tente de vérifier la présence de bibliothèques dynamiques en regardant un fichier dans un chemin ou en énumérant un répertoire échouera. A la place, vérifier la présence de la bibliothèque en essayant de dlopen() le chemin, ce qui vérifiera correctement la présence de la bibliothèque dans le cache. (62986286)

Ainsi, pour trouver ces bibliothèques, j'ai simplement placé les chemins statiques dans la fonction find_library à l'emplacement suivant <path to your Python 2 installation>/lib/python2.7/ctypes/util.py juste en dessous os.name == "posix" and sys.platform == "darwin" :

if name == 'CoreServices':
    return '/System/Library/Frameworks/CoreServices.framework/CoreServices'
elif name == 'libSystem.dylib':
    return '/usr/lib/libSystem.dylib'

à la fin, cela ressemblerait à ceci :

if os.name == "posix" and sys.platform == "darwin":
    from ctypes.macholib.dyld import dyld_find as _dyld_find
    def find_library(name):
        if name == 'CoreServices':
            return '/System/Library/Frameworks/CoreServices.framework/CoreServices'
        elif name == 'libSystem.dylib':
            return '/usr/lib/libSystem.dylib'

        possible = ['@executable_path/../lib/lib%s.dylib' % name,
                    'lib%s.dylib' % name,
                    '%s.dylib' % name,
                    '%s.framework/%s' % (name, name)]
        for name in possible:
            try:
                return _dyld_find(name)
            except ValueError:
                continue
        return None

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X