2009-12-18 6 views
1

Je rencontre un problème bizarre lorsque j'essaie d'importer un module en python uniquement lorsque le script est appelé depuis php via system ou exec.L'importation python échoue quand elle est appelée depuis PHP

À partir du shell python:

import igraph #This works. 

si la ligne précédente était dans un fichier, par exemple, test_module.py, puis:
test_module.py python dans le bash fonctionne.

Dans PHP:
exec ("test_module.py python", sortie $, valret $) -> échoue: valret $ = 1.

Cependant, si le script est à la place: import math, alors c'est bien.

Quelqu'un at-il déjà traité quelque chose de similaire?

+0

ajouter 'import sys; print sys.path' à votre script. – jfs

+0

'import os, site; print os.environ.get ('PYTHONPATH'), site.USER_SITE; aide (site) 'pourrait aussi aider. – jfs

+0

Je ne vois aucune différence dans le sys.path dans mon shell ou dans le script appelé depuis PHP. –

Répondre

0

Le module igraph est-il dans le chemin de module standard de Python ou se trouve-t-il dans le même répertoire que votre script? Si c'est le cas, il est tout à fait possible que PHP appelle le fichier python avec un répertoire de travail différent, et qu'il essaie d'importer des choses relatives à ce chemin au lieu du chemin du script.

+0

Dans la coque python: import igraph; print igraph .__ file__ renvoie /usr/lib/python2.4/site-packages/python_igraph-0.5.2-py2.4-linux-x86_64.egg/igraph/__init__.pyc Le répertoire parent/usr/lib/python2 .4/site-packages/se trouve dans le fichier sys.path lorsqu'il est appelé à partir du script PHP. Le fichier python_igraph-0.5.2-py2.4-linux-x86_64.egg se trouve également dans le fichier sys.path. –

+0

Avez-vous essayé d'obtenir la sortie de la commande (soit en spécifiant l'argument 'output' pour l'appel' exec() 'ou en utilisant' passthru() 'à la place) pour voir exactement quelle erreur python donne quand il est appelé depuis php ? – Amber

+0

J'ai essayé de le faire. Il ne semble pas sortir les messages d'erreur Python donc je n'ai aucune idée de ce qui se passe. Il a cependant une valeur de retour de 1. –

1

une chose à vérifier est sys.path

voir ce que la différence est quand appelé dans chaque sens

+1

Comme commenté ci-dessus. Je ne vois aucune différence entre les sys.path. –

0

Cela se produit parce que vous avez installé ces paquets sous un autre utilisateur, peut-être racine, ou autre chose.

Comment je ai débogué ceci, est-ce que j'ai vérifié la sortie de sys.path pour les deux cas (shell, et exec de php, qui a l'utilisateur www-data par défaut), et que j'ai comparé les deux.

J'ai remarqué que le chemin '/root/.local/lib/python2.7/site-packages' manquait lorsque je l'ai exécuté depuis PHP, qui contenait exactement ces paquets manquants. Donc, je viens de copier le contenu de ce dossier à '/usr/lib/python2.7/dist-packages/', ce qui a résolu le problème.

+0

c'est une mauvaise idée de copier des paquets python à la main. Vous devriez utiliser 'apt-get' pour installer les paquets Python dans'/usr/lib/python2.7/dist-packages/'.Sinon, utilisez 'pip' pour installer les paquets Python (peut-être dans un' virtualenv'). Vous ne voulez probablement pas lancer 'pip' sous l'utilisateur' root'. – jfs

Questions connexes