使用php访问python nltk失败

使用php访问python nltk失败,php,shell,python-2.7,nltk,Php,Shell,Python 2.7,Nltk,我试图从我的php文件中调用包含句子/单词标记器的python文件,如下所示: $output = shell_exec('python tokenizer.py $sentence') 我已经尝试了单exec,python和tokenizer.py的完整路径,将$sense用双引号括起来。但从逻辑上讲,这应该不是问题,因为在python开始时调用print(1),在实际使用任何nltk包之前调用python代码,会使$output等于“1”。所以我得出结论,这里的问题是nltk本身,比如模块

我试图从我的php文件中调用包含句子/单词标记器的python文件,如下所示:

$output = shell_exec('python tokenizer.py $sentence')
我已经尝试了单
exec
,python和tokenizer.py的完整路径,将
$sense
用双引号括起来。但从逻辑上讲,这应该不是问题,因为在python开始时调用
print(1)
,在实际使用任何nltk包之前调用python代码,会使
$output
等于“1”。所以我得出结论,这里的问题是nltk本身,比如模块的路径不正确或者其他什么

但是,使用与上面相同的命令从shell调用python会给我提供完全标记化的输出总结:从php调用python时,看起来像是神奇地“关闭”了nltk,而从shell执行时,它完全可以工作。

下面是我正在使用的python代码的一部分:

import sys
import nltk
from nltk.tokenize import sent_tokenize

sample_text2 = sys.argv[1]
gust = sent_tokenize(sample_text2)
#print(1) here doesn't work, but everywhere above (before calling sent_tokenize) it does.
服务器运行在CentOS(Linux)上,我通过SSH访问它

显而易见的问题:我在这里用PHP做错了什么?还是一般?有其他选择吗?

编辑
从dvhh的回答和评论中可以看出,出现这种情况是因为服务器上安装了两个版本(2.6和2.7),而
www
用户可以通过控制台访问2.6,默认版本是2.7。解决方案是将这两种情况下的默认python都更改为2.7,并将nltk模块放在一个依赖项文件夹中。(或者使用sys.path.append追加依赖目录)

您的php脚本由
www
用户执行

  • 您可以检查
    python
    脚本解释器是否被正确调用,它通常位于
    PATH
    环境变量(如
    /usr/bin/python
    )中的一个目录中,但是
    www
    用户没有设置
    PATH
    环境变量。
    解决方案
    shell\u exec
    调用中指定到
    python
    解释器的整个路径(在调用时也指定脚本的完整路径)

  • 安装
    nltk
    库的路径如何,您可以在
    www
    用户运行
    python
    时通过查看
    sys.path
    检查
    python
    解释器是否正确查找它。
    Diagnostic:使用
    shell\u exec
    调用运行python脚本来打印
    sys.path
    解决方案:在导入nltk之前,将库路径附加到python脚本中的
    sys.path

考虑到问题中提供的信息,这些将是最明显的解决方案

更新:
由于安装了2个版本的python(在上没有安装库),建议指定所需解释器的路径。第一个解决方案有助于纠正问题。
在类unix系统中,我建议使用
哪个python
命令来确定默认python解释器的路径。

选项1

在本地主机上设置一个简单的python httpserver侦听。也许会有帮助,但外面有很多方法。优点是,您不需要在每次需要执行ntlk时启动python解释器,也不需要担心shell脚本的执行、权限等。缺点是需要额外的工作和开销

选项2 使用任务队列。无论说什么做什么,从面向web的PHP脚本执行命令都是不安全的。如果您已经在使用RabbitMQ或类似的东西,您可以在这里使用它。或者,如果您使用的是redis,则可以使用lpush、rpop方法使redis的行为类似于队列。缺点:结果不是即时可用的

选项3

php脚本将数据输入到表中,并将python脚本设置为作为cron作业运行,以每分钟检查一次表。缺点:结果不是即时可用的

选项4


您当前的选择,但如果选择了此选项,请确保@lafor已正确转义数据@dvhh的答案应该有效。

最明显的是在任何地方使用python。但当你说“不工作”时,你看到错误了吗?没有,即使我设置了ini\U set(“显示错误”,1),也没有。我想在任何地方都使用python,但整个应用程序都是用php编写的,这需要两周的工作。你在使用virtualenv吗?差不多<代码>shell_exec('python tokenizer.py'.escapeshellarg($句子))好的,回答你关于引号和正确转义参数之间的区别的问题:单靠引号并不能使你免于像:
foo;rm-r/;echo“bar
(顺便说一句,不要尝试)。运行它,我想我可以看到问题所在。等我修好了就接受了,谢谢!如果解决方案不在我提到的范围内,请随意发布您自己的答案/解决方案,或者您可以发表评论,我将修改答案以供将来参考是的,问题是安装了两个版本,2.6和2.7。我想这两种解决方案的结合可能会有所帮助。必须手动设置路径。说明:
python--version
返回2.7.6,您建议的诊断返回适用于python 2.6的所有路径。感谢您的说明,请在问题中添加信息以供将来参考