【发布时间】:2015-12-06 03:08:07
【问题描述】:
我试图从我的 php 文件中调用一个包含句子/单词标记器的 python 文件,如下所示:
$output = shell_exec('python tokenizer.py $sentence')
我试过单个exec,python 和 tokenizer.py 的完整路径,用双引号括住 $sentence。但从逻辑上讲,这应该不是问题,因为在 python 的开头调用print(1),python 代码在实际使用任何 nltk 包之前使得$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 的答案及其 cmets 中可以看出,这种情况的发生是因为服务器上安装了两个版本(2.6 和 2.7),而 www 用户可以通过控制台访问 2.6,默认版本是 2.7。解决方案是将两种情况下的默认 python 更改为 2.7,并将 nltk 模块放入依赖文件夹之一。 (或者使用 sys.path.append 附加依赖目录)
【问题讨论】:
-
最明显的就是到处使用python。但是当你说不工作时,你看到错误了吗?
-
不,即使我设置了 ini_set('display_errors' ,1),什么也没有。我想到处都用python,但是整个app都是用php写的,好像工作了两个星期。
-
你在使用 virtualenv 吗?
-
差不多。
shell_exec('python tokenizer.py ' . escapeshellarg($sentence)); -
好的,只是为了回答你关于引号和正确转义的参数之间的区别的问题:单独的引号不会让你从“句子”中拯救你:
foo"; rm -r /; echo "bar(不要尝试,顺便说一句)。
标签: php shell python-2.7 nltk