2012-11-29 48 views
1

非标准库我已搜查通所有相关的问题,有很多类似的人,但我的问题是调用Python脚本*进口*从PHP

如何调用,从PHP,Python脚本中我进口一些非标准库/模块

更具体地,我有一个.py文件,test.py,其中我进口pycurl和瓶,这是一个Amazon 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 

更重要的是,有一个与它没有任何问题。它成功地输出“你好”,并返回代码为0,这意味着程序没有错误

然而,当我测试我的浏览器,www.someurl.com/test.php退出,一些错误发生。我逐行跟踪,发现错误发生在“import pycurl”和“import bottlenose”。

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

有人可以帮忙吗?

谢谢!

+1

运行的Web服务器是什么用户?它有权访问“/ home/my_user_name /”目录吗? – abarnert

+0

等待,当你“试图打印出sys.path”,那是在终端,它在哪里工作,不是由PHP启动,它不?这将是非常有用的信息... – abarnert

回答

0

如果您在调用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); 

这有帮助吗?

+0

哇!是啊!我试过exec(“export PYTHONPATH = X”),但没有奏效。我不知道有这样一种叫做putenv()的东西。非常感谢。 – Cheng

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给你的用户的Python的Web服务器帐户访问modules目录...但更好的方法是将模块安装到系统范围的定点软件包目录或Web服务器帐户拥有的目录。

+0

非常好的解释。真的很感激它! – Cheng