通过终端和PHP调用Python脚本有什么区别?错误在哪里?

4 投票
2 回答
1999 浏览
提问于 2025-04-16 17:55

我有一个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中的两个变量 PATHPYTHONPATH

在终端中:

$ 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(),但我不知道该怎么用,也不确定这是否是正确的方法。

2 个回答

0
$call_python = "/opt/local/bin/python2.6 ../python/lp_3.py ".$author;
$python_output = Null;
$mystring = exec($call_python, $output_python);

这段代码解决了问题。就像@AJ提到的,我需要告诉Python选择哪个版本。我选择了一个可以使用MySQLdb的版本,结果一切都正常。

4

在你的PHP代码中,你只是调用了“python”,让PHP自己决定用哪个版本的Python。你应该明确指定一个具体的Python路径,比如说 /usr/bin/python2.6。

你需要知道安装了MySQLdb的那个Python版本的确切路径。

撰写回答