【问题标题】:What is the difference between running a script from the command line and from exec() with PHP?从命令行运行脚本和使用 PHP 从 exec() 运行脚本有什么区别?
【发布时间】:2011-01-18 08:15:42
【问题描述】:

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

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

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

当我从cmd 运行它时返回[London],但是当我从exec() 运行相同的命令时在Apache 日志中抛出一个错误。脚本肯定运行正常——如果我将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'
**********************************************************************

【问题讨论】:

    标签: php python apache exec nltk


    【解决方案1】:

    从外壳/终端,您可以使用:

    sudo python -m nltk.downloader maxent_treebank_pos_tagger
    

    它将安装maxent_treebank_pos_tagger(即NLTK中的标准treebank POS标记器)。

    【讨论】:

      【解决方案2】:

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

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

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

      执行此操作后,它应该可以工作。

      【讨论】:

      • 只是想指出,因为它是 Python,所以第二行的末尾不需要分号。
      【解决方案3】:

      您的网络服务器可能以您以外的其他权限运行。可能的问题包括:

      • 路径/文件权限:网络服务器用户可以访问它需要的文件吗?
      • 不同的环境:是否设置了所有必要的环境变量(PATH、Python 特定的东西……)?
      • 配置:是否有针对 Python 或模块的每用户配置?

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

      【讨论】:

        猜你喜欢
        • 2012-05-03
        • 2015-02-23
        • 1970-01-01
        • 2012-03-16
        • 2016-11-30
        • 2010-11-01
        • 1970-01-01
        • 2014-01-15
        相关资源
        最近更新 更多