Python 本地包在 PHP 调用中无法加载

3 投票
1 回答
1199 浏览
提问于 2025-04-16 23:38

我想从PHP运行一个Python程序,这个程序是用PyProj这个库安装在我的主目录里的。虽然PHP和Python的代码都很简单,但我还是把它们放在下面以便完整性。

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

但是,当我从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 个回答

3

解决这个问题的一个好方法是从这个环境中的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中,但希望你不会在这样的服务器上运行。

撰写回答