2

我已经搜索了所有相关的问题,有很多类似的问题,但我的问题是

如何从 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,它确实包含了瓶颈的路径。

有人可以帮忙吗?

谢谢!!

4

3 回答 3

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);

这有帮助吗?

于 2012-11-29T02:23:48.367 回答
1

通常,您不会将 Web 服务器作为 运行my_user_name,而是作为特殊用户(如httpdorwww或)运行nobody。并且该用户可能无权读取您已安装的 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块中以打印出异常并查看它失败的原因,这样我们就不必猜测了。

如果这问题所在,快速而简单的解决方案是让您的 Web 服务器帐户通过chmod……访问您用户的 Python 模块目录,但更好的解决方案是将模块安装到系统范围的站点包目录,或者安装到由Web 服务器帐户。

于 2012-11-29T02:22:45.153 回答
0

对于您的情况来说,它可能太重了,但是您是否考虑过virtualenv

于 2012-11-29T02:37:53.820 回答