【问题标题】:AttributeError running Django site on Mac 11.0.1在 Mac 11.0.1 上运行 Django 站点的 AttributeError
【发布时间】:2021-03-15 17:03:36
【问题描述】:

在我将 Mac OS 更新到 11.0.1 之前,我在本地运行一个运行良好的 django 站点时遇到错误。我认为这个更新是问题的原因,因为在它工作时和现在之间没有真正改变。

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

这是我的 brew 配置

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

通常我会使用运行 python 2.7.15 的 virtualenv 来运行该站点,但我遇到了同样的错误。我用pyenv重新安装了python并重新制作了virtualenv,但出现了同样的错误。我正在使用 Kombu 3.0.37 运行 Django 1.10.8

【问题讨论】:

  • 这有帮助吗?:breedlovebreedlove.blogspot.com/2015/04/… "... 使用自制 python 的库之间的 dyld_fallback_library_path 环境变量中的冲突..."
  • DYLD_FALLBACK_LIBRARY_PATH 没有在任何地方设置,所以我认为这不是解决方案
  • 我的 macbook arm with big sur 也遇到了同样的问题......尝试使用 PyCharm 在调试模式下运行它,因为它正在工作......但我不知道为什么...... .
  • 尝试在 PyCharm 中以调试模式运行,同样的问题
  • 哦我忘了说我也在用pyenv-virtualenv

标签: python django python-2.7 kombu


【解决方案1】:

好的,这是 Big Sur 兼容性的肮脏解决方法:

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

macOS Big Sur 11.0.1 中的新功能,系统附带内置动态 所有系统提供的库的链接器缓存。作为这一变化的一部分, 文件系统上不再存在动态库的副本。 尝试通过查找来检查动态库是否存在的代码 对于路径中的文件或枚举目录将失败。反而, 通过尝试 dlopen() 路径检查库是否存在,该路径 将正确检查缓存中的库。 (62986286)

所以为了找到这些库,我只需将静态路径放在 &lt;path to your Python 2 installation&gt;/lib/python2.7/ctypes/util.py 的 find_library 函数中,就在 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'

最后会是这样的:

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

【讨论】:

  • 非常感谢,完美运行。真的把我的头发拉出来了。
  • 一点澄清:上面的更改(额外的 if/elseif)应该添加到文件 &lt;path to your Python 2 installation&gt;/lib/python2.7/ctypes/util.py
  • 为我工作。非常感谢!
  • 感谢我升级到 11.4 anacoda 拒绝工作的答案。现在一切正常。谢谢
【解决方案2】:

Bigsur 11.5.1 更新后我遇到了同样的问题(也许,只是巧合)。上面提供的答案仍然有效,但我不知道该怎么做,因为我是新手。以下是要遵循的步骤:

  1. 查看错误,找到安装 python 2.7 的文件util.py 的路径。使用文本编辑器打开它。
  2. 打开文件后,搜索“posix”,确保它看起来像这样"posix" and sys.platform == "darwin"
  3. 找到def find_library(name):这一行,并在上面的答案中添加脚本。

我已附上截图供参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2010-09-23
    • 2021-05-20
    • 2012-05-24
    • 2016-04-19
    • 2011-12-18
    • 2018-04-11
    相关资源
    最近更新 更多