当我尝试在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
,那么这很好。
有人曾经处理类似的事情吗?
答案 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输出中缺少的路径可能是包含该软件包的路径。 因此,请在服务器上运行的python文件中添加以下行。
import sys
sys.path.append("path-to-the-missing-directory")
运行它。