MAMP Python-MySQLdb问题:调用Python文件后libssl.1.0.0.dylib路径改变
我正在尝试使用 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 个回答
我发现我应该使用位于 /usr/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
。
我创建了一个符号链接,让系统知道应该从哪里找到 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.dylib
和 libcrypto.dylib
。