我通过所有相关问题搜索过,有很多相似的问题,但我的问题是
如何从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的路径。
有人可以帮忙吗?
谢谢!
答案 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
身份运行网络服务器,而是以httpd
或www
或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
块中以打印出异常,看看它失败的原因,所以我们不必猜测。
如果 问题,那么快速和彻底的解决方案是通过chmod
让您的Web服务器帐户访问您用户的Python模块目录...但更好的解决方案是安装模块到系统范围的站点包目录,或者到Web服务器帐户拥有的目录。
答案 2 :(得分:0)
对你的情况来说,这可能太重了,但是你考虑过virtualenv吗?