2010-02-18 13 views
6

Estoy tratando de ejecutar un script de Python usando exec() desde PHP. Mi comando funciona bien cuando lo ejecuto directamente usando una ventana cmd, pero produce un error cuando lo ejecuto desde exec() en PHP.¿Cuál es la diferencia entre ejecutar un script desde la línea de comandos y desde exec() con PHP?

La secuencia de comandos My Python usa NTLK para encontrar los nombres propios. Comando de ejemplo:

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

vuelve [London] cuando lo ejecuto desde cmd, pero genera un error en el registro de Apache cuando corro el mismo comando de exec() .La escritura es cada vez definitivamente plazo OK - si cambio de la secuencia de comandos de Python ser print "Hello World" que se devuelve bien.

Sé que es una gran pregunta para que alguien sepa cómo solucionar este error NLTK, pero realmente podría hacer con cualquier punteros sobre por qué ejecutarlo desde exec es diferente a cmd. (El comando es idéntico).

Estoy ejecutando WAMP en Windows 7 con Apache 2.2.11.

Aquí está el error en el registro de 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' 
********************************************************************** 

Respuesta

2

Su servidor web probablemente se ejecuta con otros privilegios que tú. Los posibles problemas incluyen:

  • Permiso de ruta/archivo: ¿puede el usuario del servidor web acceder a los archivos que necesita?
  • Entorno diferente: ¿se configuran todas las variables de entorno necesarias (RUTA, elementos específicos de Python, ...)?
  • Configuración: ¿hay configuraciones por usuario para Python o el módulo?

Consejo: ejecutar conjunto tanto en el símbolo del sistema y del proceso de PHP y comprobar las diferencias.

30

Tienes que ejecutar nltk.download() y elegir 'maxent_treebank_pos_tagger'. Debe hacer un script python y ponerlo:

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

y ejecutarlo desde la línea de comandos. Instalará los archivos de datos para las etiquetas POS, que aún no tiene instaladas.

Después de hacer esto, debería funcionar.

+0

Solo quería señalar que, dado que es Python, no necesitará un punto y coma al final de la segunda línea. – Gaurang

0

Desde el shell/terminal, puede utilizar:

sudo python -m nltk.downloader maxent_treebank_pos_tagger 

Se instalará maxent_treebank_pos_tagger (es decir, el etiquetador Treebank POS estándar en NLTK).

Cuestiones relacionadas