调用python脚本*与从PHP导入的非标准库*

时间:2012-11-29 02:06:29

标签: php python error-handling

我通过所有相关问题搜索过,有很多相似的问题,但我的问题是

如何从php调用一个python脚本,我在其中导入了一些非标准库/模块

更具体地说,我有一个.py文件test.py,我在其中导入了pycurl和bottlenose,这是一个亚马逊API包装器。两个模块都不在标准库中。所以文件看起来像

import pycurl
import bottlenose
...
print "hello!"

然后我制作了一个php文件test.php

<?
$output = array();
exec("/home/my_user_name/local/Python-2.7/bin/python test.py", $output, $ret_code);
var_dump( $output);
echo $ret_code;
?>

test.php和test.py都在同一目录下。更重要的是,如果我运行

php test.php 

在我的终端中,没有问题。它成功输出“hello”,返回代码为0,表示程序退出时没有错误

但是,当我在我的浏览器上测试时,www.someurl.com / test.php,发生了一些错误。我逐行跟踪,发现错误发生在“import pycurl”和“import bottlenose”。

我也尝试打印出sys.path,它确实包含了bottlenose的路径。

有人可以帮忙吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果你在调用Python程序之前在php脚本中调用putenv,我会相信sys.path是正确的。

从成功运行起,抓住机会打印sys.path。我们将此打印的结果称为“x”。然后,尝试以下方法:

putenv('PYTHONPATH=x');
exec("/home/my_user_name/local/Python-2.7/bin/python test.py", $output, $ret_code);

这有帮助吗?

答案 1 :(得分:0)

通常,您不会以my_user_name身份运行网络服务器,而是以httpdwwwnobody等特殊用户身份运行。并且该用户可能没有权限读取您安装的Python模块,这当然会导致导入失败。

要测试此功能,请在导入之前尝试打开它:

try:
    with open('/path/to/bottlenose.py', 'r') as f:
        print('Opened file just fine')
except Exception as e:
    print('Failed to open file: %s' % (e,))

当然,如果print在您的设置中无效,那么无论您打印出sys.path是什么,请在此处执行相同的操作。

如果这不是问题,您可以尝试将导入包装在try块中以打印出异常,看看它失败的原因,所以我们不必猜测。

如果 问题,那么快速和彻底的解决方案是通过chmod让您的Web服务器帐户访问您用户的Python模块目录...但更好的解决方案是安装模块到系统范围的站点包目录,或者到Web服务器帐户拥有的目录。

答案 2 :(得分:0)

对你的情况来说,这可能太重了,但是你考虑过virtualenv吗?