从PHP调用时,python导入失败

时间:2009-12-18 01:34:39

标签: php python import exec

当我尝试在python中导入模块时,我遇到了一个令人费解的问题,只有当通过系统或exec从php调用脚本时。

来自python shell:

import igraph #This works.

如果前一行是在文件中,比如test_module.py,那么:
bash中的python test_module.py。

在PHP中:
exec(“python test_module.py”,$ output,$ retval) - >失败:$ retval = 1。

但是,如果脚本改为:import math,那么这很好。

有人曾经处理类似的事情吗?

4 个答案:

答案 0 :(得分:1)

要检查的一件事是sys.path

了解每次调用时的区别

答案 1 :(得分:0)

igraph模块是Python的标准模块路径,还是与您的单个脚本位于同一目录中?如果是这样,PHP很可能使用不同的工作目录调用python文件,并且它试图导入相对于该路径而不是脚本路径的内容。

答案 2 :(得分:0)

这种情况正在发生,因为您已在不同的用户(可能是root用户)或其他用户下安装了这些软件包。

我如何调试这个,我检查了sys.path的输出两种情况(shell和php的exec,默认情况下有用户www-data),而且我比较了两者。

当我从PHP运行它时,我注意到'/root/.local/lib/python2.7/site-packages'路径丢失,其中包含这些缺少的包。 所以我只是将此文件夹的内容复制到'/usr/lib/python2.7/dist-packages/',这解决了问题。

答案 3 :(得分:0)

这可能是由于以下原因。

导入软件包时,将搜索某些目录。这些目录在sys.path中指定

使用以下几行创建一个python文件。

import sys
print(sys.path)
  • 在外壳中运行此文件,并记下输出(目录路径列表)。
  • 在本地服务器上运行同一文件(使用PHP)并比较输出。

PHP输出中缺少的路径可能是包含该软件包的路径。 因此,请在服务器上运行的python文件中添加以下行。

import sys
sys.path.append("path-to-the-missing-directory")

运行它。