Python本地包不能从PHP中加载调用


Python Local Package Doesn't Load In Call From PHP

所以,我想运行一个Python程序,在主目录下安装PHP中的PyProj。PHP和Python很简单,但为了完整起见,我将它们包括在下面。

我已经测试了手动运行Python,使用sys.path.appendPYTHONPATH来指定包的位置。这两种方法都有效。

然而,当我shell_exec脚本从PHP,我告诉ImportError: No module named pyproj .

对文件系统进行递归检查,发现所有文件都可以被用户、组和其他人读取/执行。

有人知道为什么我不能让这个运行吗?

我在PHP脚本中调用它,如下所示

<?php
        putenv('PYTHONPATH="/home/userperson/public_html/lib64/python2.4/site-packages"');
        $ret=shell_exec("./bob");
        print $ret;
?>

Python程序很简单。

#!/usr/bin/python
import pyproj
import sys
sys.path.append("/home/userperson/public_html/lib64/python2.4/site-packages")
surfproj = pyproj.Proj(proj='lcc',lat_1=40,lat_2=50,lon_0=-95,lat_0=40,ellps='WGS84')
x,y=surjproj(-95,45)
print x

解决此类问题的一个好方法是在此环境中从Python脚本打印sys.path,并检查当前路径:

 #!/usr/bin/python
 import sys
 print sys.path

我猜它将包含'"/home/userperson/public_html/lib64/python2.4/site-packages"'(注意多余的双引号)。

putenv($setting)的文档没有说明在设置中支持shell语法、引号或转义,因此字符串中出现的任何字符无疑将以环境变量的值结束。一个可能的解决方案是:

putenv('PYTHONPATH=/home/userperson/public_html/lib64/python2.4/site-packages');

另一个有用的提示是将路径放在一个单独的变量中,并且只执行putenv("PYTHONPATH=$pythonpath")putenv("PYTHONPATH=" . implode(':', $pythonpath)),因为这将允许您检查使用file_exists的PHP脚本中的路径是否存在。

旧版本的PHP可能有问题,如果safe_mode是启用的,PYTHONPATH不在safe_mode_allowed_env_vars中,但希望你不是运行在这样配置的服务器上。