Python 本地包在 PHP 调用中无法加载
我想从PHP运行一个Python程序,这个程序是用PyProj这个库安装在我的主目录里的。虽然PHP和Python的代码都很简单,但我还是把它们放在下面以便完整性。
我已经测试过手动运行Python,使用了sys.path.append
和PYTHONPATH
来指定包的位置。这两种方法都能正常工作。
但是,当我从PHP用shell_exec
来执行这个脚本时,出现了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
1 个回答
解决这个问题的一个好方法是从这个环境中的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
中,但希望你不会在这样的服务器上运行。