所以,我想运行一个Python程序,在主目录下安装PHP中的PyProj。PHP和Python很简单,但为了完整起见,我将它们包括在下面。
我已经测试了手动运行Python,使用sys.path.append
和PYTHONPATH
来指定包的位置。这两种方法都有效。
然而,当我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
中,但希望你不是运行在这样配置的服务器上。