我有一个PHP脚本,它调用python脚本
$call_python = "python ../python/lp_3.py ".$author;
$python_output = Null;
$mystring = exec($call_python, $output_python);
这会在日志中产生错误:
$ vi logs/error_log shows
....
Traceback (most recent call last):
File "../python/lp_3.py", line 14, in <module>
import MySQLdb
ImportError: No module named MySQLdb
如果我在终端python python/lp_3.py
,一切都很好。我错过了什么?
编辑:
在 @S.Lott 的建议下,我查看了终端和 PHP 中PATH
和PYTHONPATH
变量。
在终端中:
$ echo $PYTHONPATH
$ echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/texbin:/usr/X11/bin
如您所见,PYTHONPATH
是空的。
在 PHP 中:
echo getenv("PYTHONPATH"); // NOTHING
echo getenv("PATH"); // /usr/bin:/bin:/usr/sbin:/sbin
也许我应该提到我的 python 脚本中的前两行是
#!/usr/bin/env python
# encoding: utf-8
我愿意接受建议。 =)
编辑2:
我检查了Mac上每个已安装的python版本。我发现python2.7没有安装MySQLdb。有没有办法告诉PHP不要使用python2.7,而是使用例如python2.6?我尝试在PHP中玩弄setenv()
,但我不知道如何正确使用它,我什至不知道这是否是正确的方法。
在你的PHP代码中,你只是调用"python",让PHP决定使用哪个版本的Python。使用特定 Python 二进制文件的显式路径(例如/usr/bin/python2.6)。
你需要知道安装了MySQLdb的Python版本的确切路径。
$call_python = "/opt/local/bin/python2.6 ../python/lp_3.py ".$author;
$python_output = Null;
$mystring = exec($call_python, $output_python);
做了这项工作。就像@AJ指出的那样,我必须告诉python选择哪个版本。我选择了一个MySQLdb可用的版本,一切都很好。