MAMP Python-MySQLdb问题:调用Python文件后libssl.1.0.0.dylib路径改变

5 投票
1 回答
2558 浏览
提问于 2025-04-19 00:09

我正在尝试使用 Python 的 MySQLdb 来访问我在 MAMP 服务器上的 MySQL 数据库。

最开始我试着用 python-sql 调用一个 Python 文件来访问 MAMP 上的数据库时,出现了一个错误,提示 image not found,这个错误和 libssl.1.0.0.dylib 这个库有关。

 Traceback (most recent call last):
  File "desktopsql.py", line 3, in <module>
    import _mysql as ms
  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.5-x86_64/egg/_mysql.py", line 6, in __bootstrap__

  ImportError: 
   dlopen(/Users/username/.python-eggs/MySQL_python-1.2.5-py2.7-macosx-
  10.5-x86_64.egg-tmp/_mysql.so, 2): 

  Library not loaded: libssl.1.0.0.dylib

  Referenced from: 
   /Users/username/.python-eggs/MySQL_python-1.2.5-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so

  Reason: image not found

我通过改变 libssl.1.0.0.dylib 的路径来解决了这个问题,具体做法是使用 export DYLD_LIBRARY_PATH=/Users/username/anaconda/lib/:$DYLD_LIBRARY_PATH,但每次在不同的文件夹执行 Python 文件时都得重新设置这个路径。

所以当我试图通过 PHP 在 MAMP 网页上执行 Python 文件时,又出现了同样的错误,这次我不能用之前的临时解决办法来掩盖这个问题。

我还尝试用 install_name_tool 来进一步修复,把错误的库位置 /Users/username/.python-eggs/MySQL_python-1.2.5-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so 改成它实际存放的地方 /Users/username/anaconda/lib/

sudo install_name_tool -change 
libssl.1.0.0.dylib 
/Users/username/anaconda/lib/libssl.1.0.0.dylib 
/Users/username/.python-eggs/MySQL_python-1.2.5-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so

做完这些后,我用 otool -L 查看我所做的更改,结果显示文件路径确实已经改成了正确的位置。

otool -L 
/Users/username/.python-eggs/MySQL_python-1.2.5-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so

    /Users/username/anaconda/lib/libssl.1.0.0.dylib 
    (compatibility version 1.0.0, current version 1.0.0)

然而当我再次运行这个 Python 文件时,还是出现了 image not found 的错误。再次运行 otool -L 后,结果显示文件路径又回到了之前的状态。

/Users/username/.python-eggs/MySQL_python-1.2.5-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so:

    libssl.1.0.0.dylib 
    (compatibility version 1.0.0, current version 1.0.0)

所以,路径在我运行 Python 文件之前是正确的,但一旦运行它,路径又变回原来的样子。

为什么会这样呢?有没有什么办法可以让它保持我所做的更改?

1 个回答

6

我发现我应该使用位于 /usr/liblibssl.1.0.0.dylib 文件,而不是错误信息中提到的那个文件。在我的情况下,那个文件是 Users/$USERNAME/.python-eggs/MySQL_python-1.2.5-py2.7-macosx-10.5-x86_64.egg-tmp/_mysql.so

我创建了一个符号链接,让系统知道应该从哪里找到 libssl.1.0.0.dylib 文件(对我来说是 /Users/$USERNAME/anaconda/lib/),命令是:

sudo ln -s /Users/$USERNAME/anaconda/lib/libssl.1.0.0.dylib /usr/lib/libssl.1.0.0.dylib

完成这个后,我也对 libcrypto.1.0.0.dylib 做了同样的操作,因为它也出现了同样的错误。

sudo ln -s /Users/$USERNAME/anaconda/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.1.0.0.dylib

顺便提一下,当我查看 /usr/bin 里的文件时,这两个文件被列为 libss.dyliblibcrypto.dylib

撰写回答