【问题标题】:Python Local Package Doesn't Load In Call From PHPPython 本地包不加载从 PHP 调用
【发布时间】:2023-03-18 01:33:02
【问题描述】:

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

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

但是,当我 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

【问题讨论】:

  • 如果你先import sys,然后print sys.path,会发生什么?输出是否包含包含您的模块的目录?

标签: php python linux


【解决方案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 脚本中是否存在路径。

如果启用了safe_mode 并且PYTHONPATH 不在safe_mode_allowed_env_vars 中,旧版本的PHP 可能会出现问题,但希望您没有在这样配置的服务器上运行。

【讨论】:

  • 好电话。路径中有多余的引号,所以现在可以使用 putenv 了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-08-07
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多