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


问题内容

我正在尝试从PHP内部使用exec()运行Python脚本。当我直接使用cmd窗口运行命令时,我的命令运行良好,但是当我从exec()PHP运行该命令时会产生错误。

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

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

[London]从我运行它时返回cmd,但是当我从exec()该命令运行相同命令时,在Apache日志中引发错误。该脚本一定可以正常运行-
如果将python脚本更改为可以print "Hello World"正常返回。

我知道对任何人都知道如何解决此NLTK错误是一个很大的要求,但是我真的可以使用任何指针来说明为什么从中运行它exec不同于cmd。(命令是相同的)。

我正在Windows 7和Apache 2.2.11上运行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或模块配置?

提示:set在命令提示符和PHP进程中都执行,并检查差异。