无法在Mac OS的crontab中导入mysql-python
我写了一个脚本,运行得很好,但当我通过定时任务(crontab)来运行它时,出现了导入错误。
Traceback (most recent call last):
File "/Users/.../Desktop/test.py", line 3, in <module>
import MySQLdb as mysql
File "build/bdist.macosx-10.7-intel/egg/MySQLdb/__init__.py", line 19, in <module>
File "build/bdist.macosx-10.7-intel/egg/_mysql.py", line 7, in <module>
File "build/bdist.macosx-10.7-intel/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/.../.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
Referenced from: /Users/.../.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg-tmp/_mysql.so
Reason: image not found
我尝试在脚本的顶部加上这行 #!/usr/bin/python
,但问题依然存在。
我使用的是 Mac OS 10.7 版本。
补充说明:定时任务尝试从当前目录(也就是我的主文件夹)加载 mysql-python lopen(/Users/.../.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg-tmp/_mysql.so, 2)
,而这个库实际上在 /Library/Python/2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg
里。我尝试在定时任务中使用 PYTHONPATH=/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
,但没有效果,有什么建议吗?
谢谢。
4 个回答
我觉得你应该检查一下你的Python版本。在Mac上,可能安装了好几个版本的Python,比如2.5、2.6和2.7。
当你在终端运行时,可能用的是Python 2.6,但对于定时任务(cron job),它可能用的是2.7。
你可以用 python -V
来查看你正在使用哪个版本的Python。
用 which python
可以找到Python的安装路径。
你还可以用命令行的自动补全功能来查看你安装了多少个Python版本。当你输入python后,按一下“tab”键,就能看到结果。
来自Mysqldb的常见问题解答:http://mysql-python.sourceforge.net/FAQ.html
还有一个可能导致这个问题的原因是:你的系统路径中可能没有MySQL的库文件。
解决办法:
设置LD_LIBRARY_PATH环境变量,让它包含MySQL库文件的路径。
在site.cfg中设置static=True,以便进行静态链接。
这可能意味着在你的定时任务(crontab)中,MySQL的库文件无法访问(不在路径中,也不在LD_LIBRARY_PATH中)。
检查一下你在“普通”命令行和“定时任务”命令行中的环境变量。
我通过以下链接的解决方案解决了这个问题: https://unix.stackexchange.com/questions/27289/how-can-i-run-a-cron-command-with-existing-environmental-variables
在我的情况下,问题是Cron没有访问我的环境变量,这些变量指向了Mysql库的正确位置。
我使用了:
8 10 * * * . $HOME/.bash_profile; /Path/To/Script/pythonDbScript.py