无法在Mac OS的crontab中导入mysql-python

2 投票
4 回答
1292 浏览
提问于 2025-04-17 07:27

我写了一个脚本,运行得很好,但当我通过定时任务(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 个回答

0

我觉得你应该检查一下你的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”键,就能看到结果。

0

来自Mysqldb的常见问题解答:http://mysql-python.sourceforge.net/FAQ.html

还有一个可能导致这个问题的原因是:你的系统路径中可能没有MySQL的库文件。

解决办法:

设置LD_LIBRARY_PATH环境变量,让它包含MySQL库文件的路径。

在site.cfg中设置static=True,以便进行静态链接。

这可能意味着在你的定时任务(crontab)中,MySQL的库文件无法访问(不在路径中,也不在LD_LIBRARY_PATH中)。

检查一下你在“普通”命令行和“定时任务”命令行中的环境变量。

2

我通过以下链接的解决方案解决了这个问题: 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

撰写回答