zoukankan      html  css  js  c++  java
  • 【uwsgi】Mac下python dyld :Library not loaded 问题解决

    今天在Mac下使用uwsgi运行Python Flask的web程序时遇到了dyld: Library not loaded问题,记录一下解决方法

    问题

    今天本来想使用uwsgi在本地运行一下之前编写的flask程序,以便部署到服务器,结果遇到了一个比较坑的问题。

    本来我的Mac没有安装uwsgi,使用如下命令安装了uwsgi

    1
    pip3 install uwsgi

    我的电脑上有Python2 和 Python3 两个环境,pip对应Python2 ,pip3 对应 Python3

    安装了之后,运行flask官方文档的uwsgi的运行命令,结果遇到了如下问题

    1
    2
    3
    4
    5
    dongxiyan@MacBook-Pro ~ % uwsgi -s /tmp/app.sock --manage-script-name --mount /app=app:app
    dyld: Library not loaded: @rpath/Python3.framework/Versions/3.8/Python3
    Referenced from: /Users/dongxiyan/Library/Python/3.8/bin/uwsgi
    Reason: image not found
    zsh: abort uwsgi

    报了dyld: Library not loaded这个错,uwsgi运行不起来

    解决步骤

    经过一通google、百度,发现原因是在运行uwsgi时找不到了Python3的动态库,即该路径@rpath/Python3.framework/Versions/3.8/Python3不存在。

    不应该啊,我记得我的电脑装了Python3的,猜想是不是Python2和Python3乱了环境,uwsgi去找了Python2的库,查看Python2和Python3的具体路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    dongxiyan@MacBook-Pro ~ % which /usr/bin/python
    /usr/bin/python
    dongxiyan@MacBook-Pro ~ % otool -L /usr/bin/python
    /usr/bin/python:
    /System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.16)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
    dongxiyan@MacBook-Pro ~ % which /usr/bin/python3
    /usr/bin/python3
    dongxiyan@MacBook-Pro ~ % otool -L /usr/bin/python3
    /usr/bin/python3:
    /usr/lib/libxcselect.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)

    otool -L /usr/bin/python 查看/usr/bin/python 的依赖
    otool Mac 下的反编译工具

    看到Python2 和 Python3 的依赖不一样,Python2下有依赖/System/Library/Frameworks/Python.framework/Versions/2.7/Python,按理说Python3也应该依赖/System/Library/Frameworks/Python.framework/Versions/3.8/Python,但是查出来的依赖里没有,查看/System/Library/Frameworks/Python.framework/Versions/路径下的文件,没有Python3的

    1
    2
    dongxiyan@MacBook-Pro ~ % ls /System/Library/Frameworks/Python.framework/Versions/
    2.3 2.5 2.6 2.7 Current

    但是我在命令行下运行Python3是没问题的,说明Python3的库不在这个目录下/System/Library/Frameworks/Python.framework/Versions//usr/bin/python3的依赖应该也没有问题,因为python3能成功运行

    1
    2
    3
    4
    5
    dongxiyan@MacBook-Pro ~ % python3
    Python 3.8.2 (default, Dec 21 2020, 15:06:04)
    [Clang 12.0.0 (clang-1200.0.32.29)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

    应该不是乱环境了,如果是乱环境了,应该是报dyld: Library not loaded: @rpath/Python.framework/Versions/2.7/Python这个错才对,估计原因是/System/Library/Frameworks/Python3.framework/Versions/3.8/Python3 这个的路径不存在,查一下,果然不存在

    python

    但为什么会不存在的呢?我的Python3在本地运行时没问题的啊,那应该就是Python3的运行路径不在上面那个路径下,这个路径要怎样设置才正确呢?

    然后继续谷歌百度@rpath/Python3.framework/Versions/3.8/Python3相关内容,查到@rpath的意思是可执行程序内部设置的一组路径,那解决办法就是把我的本地Python3的路径添加到@rpath 下应该就行了,根据Python2的依赖,估计@rpath 指的就是/System/Library/Frameworks。

    先找到本地Python3的运行路径,命令行下import sys sys.path

    可以看到本地Python3的路径为/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8,原来使用的是Xcode的Python3环境,那把这个路径加到@rpath 下问题应该就解决了。

    但是经过一通谷歌百度,也没找到@rpath 的添加方法,不过找到了修改uwsgi动态库依赖的方法,查看uwsgi的依赖

    1
    2
    3
    4
    5
    6
    7
    8
    dongxiyan@MacBook-Pro ~ % otool -L /Users/dongxiyan/Library/Python/3.8/bin/uwsgi
    /Users/dongxiyan/Library/Python/3.8/bin/uwsgi:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
    /usr/local/opt/pcre/lib/libpcre.1.dylib (compatibility version 4.0.0, current version 4.12.0)
    /usr/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 8.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1770.255.0)
    @rpath/Python3.framework/Versions/3.8/Python3 (compatibility version 3.8.0, current version 3.8.0)

    只要把@rpath/Python3.framework/Versions/3.8/Python3改成正确的路径应该就行了,在这里把它换成Xcode的Python3路径

    修改命令如下

    1
    install_name_tool -change @rpath/Python3.framework/Versions/3.8/Python3 /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/Python /Users/dongxiyan/Library/Python/3.8/bin/uwsgi

    工具install_name_tool可以用来修改应用程序对动态库的查找路径

    修改完成后运行uwsgi命令,成功运行,问题解决。

    总结

    这个问题真的好坑,折腾了我一下午,刚开始查到网上说的解决方案是使用brew升级一下Python3就可以,但是我并没有使用brew安装Python3,显然这个方案解决不了我这个问题,最终经过一番查抄,问题的根源就是Python3的动态库没找到,把Python3的动态库链接改为正确的路径就可以。

    但是感觉修改uwsgi的动态库链接治标不治本,如果哪一天又安装了一个库,它也使用了@rpath ,这个错估计又要报出来了。

    其他库报这个错时也可以用这个方法解决,不过这个错误正确的解决方法应该就是把本地Python3的路径加到@rpath 下,但目前还未找到如何添加,后面再研究一下吧,至少目前的问题解决了。

    参考

    修复 dyld: Library not loaded

    install_name_tool解决dyld: Library not loaded

    mac加载路径@rpath

    MacOS平台下@rpath在动态链接库中的应用

    MAC: @rpath的坑

    python3错误

    https://www.cnblogs.com/yrxns/p/11208861.html

  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/gtea/p/15614512.html
Copyright © 2011-2022 走看看