从命令行和exec()与PHP运行脚本有什么区别?

问题描述:

我想在PHP中使用exec()来运行Python脚本。当我直接使用cmd窗口运行它时,我的命令工作正常,但是当我在PHP中使用exec()运行它时会产生错误。从命令行和exec()与PHP运行脚本有什么区别?

我的Python脚本使用NTLK来查找专有名词。例如命令:

"C:\Python25\python.exe" "C:\wamp\projects\python\trunk\tests\find_proper_nouns.py" "I went to London this morning" 

回报,当我从cmd运行它,但在Apache的抛出一个错误,当我从exec()运行相同的选指令,脚本defintely越来越运行正常登录[London] - 如果我改变了python脚本是print "Hello World"这是很好的回报。

我知道如何解决这个NLTK错误是一个很大的问题,但我真的可以做任何指示,为什么从exec运行它不同于cmd。 (该命令是相同的)。

我使用Apache 2.2.11在Windows 7上运行WAMP。

这里是在Apache日志中的错误:

Traceback (most recent call last): 
    File "C:\wamp\projects\python\trunk\tests\find_proper_nouns_command_line.py", line 6, in <module> 
    parts = nltk.pos_tag(text) 
    File "C:\Python25\lib\site-packages\nltk\tag\__init__.py", line 62, in pos_tag 
    tagger = nltk.data.load(_POS_TAGGER) 
    File "C:\Python25\lib\site-packages\nltk\data.py", line 590, in load 
    resource_val = pickle.load(_open(resource_url)) 
    File "C:\Python25\lib\site-packages\nltk\data.py", line 669, in _open 
    return find(path).open() 
    File "C:\Python25\lib\site-packages\nltk\data.py", line 451, in find 
    raise LookupError(resource_not_found) 
LookupError: 
********************************************************************** 
    Resource 'taggers/maxent_treebank_pos_tagger/english.pickle' not 
    found. Please use the NLTK Downloader to obtain the resource: 
    >>> nltk.download(). 
    Searched in: 
    - 'C:\\nltk_data' 
    - 'D:\\nltk_data' 
    - 'E:\\nltk_data' 
    - 'C:\\Python25\\nltk_data' 
    - 'C:\\Python25\\lib\\nltk_data' 
    - 'C:\\Windows\\system32\\config\\systemprofile\\AppData\\Roaming\\nltk_data' 
********************************************************************** 

你的Web服务器有可能与其他特权比你运行。可能的问题包括:

  • 路径/文件权限:Web服务器用户可以访问它需要的文件吗?
  • 不同的环境:所有必要的环境变量(PATH,Python特定的东西,...)集?
  • 配置:是否有Python或模块的每个用户配置?

提示:在命令提示符下执行设置并从PHP进程中检查差异。

您必须运行nltk.download()并选择'maxent_treebank_pos_tagger'。您必须制作一个python脚本并在其中放入:

#!/usr/bin/python 
import nltk 
nltk.download('maxent_treebank_pos_tagger'); 

然后从命令行运行它。它将安装您尚未安装的POS标签的数据文件。

当你这样做后,它应该工作。

+0

只是想指出,因为它是Python,所以在第二行末尾不需要分号。 – Gaurang 2014-11-03 06:09:29

从壳/终端,可以使用:

sudo python -m nltk.downloader maxent_treebank_pos_tagger 

它将安装maxent_treebank_pos_tagger(即标准树库POS中NLTK标注器)。