Quelle est la différence entre l'exécution d'un script à partir de la ligne de commande et de exec () avec PHP?
Question
Je suis en train d'exécuter un script Python en utilisant exec () à partir de PHP. Ma commande fonctionne très bien quand je le lance directement à l'aide d'une fenêtre de cmd
, mais il produit une erreur quand je le lance à partir exec()
en PHP.
Mon script Python utilise NTLK pour trouver les noms propres. Exemple de commande:
"C:\Python25\python.exe" "C:\wamp\projects\python\trunk\tests\find_proper_nouns.py" "I went to London this morning"
retourne [London]
quand je le lance à partir cmd
, mais génère une erreur dans le journal Apache quand je lance la même commande à partir du script est exec()
.The obtenir defintely run OK - si je change le script python être print "Hello World"
qui est retourné bien .
Je sais qu'il est un grand demander à quiconque de savoir comment résoudre cette erreur de NLTK, mais je ne pouvais vraiment faire avec des pointeurs pour expliquer pourquoi l'exécuter à partir exec
est différent de cmd
. (La commande est identique).
Je suis en cours d'exécution WAMP sous Windows 7 avec Apache 2.2.11.
Voici l'erreur dans le journal 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'
**********************************************************************
La solution
Votre serveur web fonctionne probablement avec d'autres privilèges que vous. problèmes possibles:
- Chemin / autorisation de fichier: peut l'accès des utilisateurs du serveur Web les fichiers dont il a besoin
- environnement différent: sont toutes les variables d'environnement nécessaires (PATH, des choses spécifiques à Python, ...) set ?
- Configuration: y at-il des configurations par utilisateur pour Python ou le module ?
Astuce:. Exécuter set à la fois l'invite de commande et du processus PHP et vérifier les différences
Autres conseils
Vous devez exécuter nltk.download()
et choisissez « maxent_treebank_pos_tagger ». Vous devez faire un script python et le mettre:
#!/usr/bin/python
import nltk
nltk.download('maxent_treebank_pos_tagger');
puis exécutez la ligne de commande. Il installera les fichiers de données pour les POS taggés, que vous n'avez pas encore installé.
Une fois que vous faites cela, il devrait fonctionner.
À partir du shell / terminal, vous pouvez utiliser:
sudo python -m nltk.downloader maxent_treebank_pos_tagger
Il installera maxent_treebank_pos_tagger
(à savoir la norme tagger treebank POS dans NLTK).