我试图从我的 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 的回答及其评论中可以看出,发生这种情况是因为服务器上安装了两个版本(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_exec
调用中指定python
解释器的完整路径(在执行脚本时还要指定脚本的完整路径)nltk
库的安装路径怎么样,您可以通过查看sys 来检查
。python
解释器是否正确查找它使用www
用户运行python
时的 .path
诊断:使用shell_exec
调用运行python脚本来打印sys.path
值 解决方案:在import nltk
之前将库路径附加到Python脚本中的
sys.path
中
考虑到问题中提供的信息,这些将是最明显的解决方案。
更新:
由于安装了 2 个版本的 python(尚未安装库),建议指定所需解释器的路径。第一个解决方案有助于纠正问题。
在类 Unix 系统中,我建议使用 which python
命令来确定默认 python 解释器的路径。
关于php - 用php访问python nltk失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32491545/