2009-11-18 12 views
1

J'ai installé feedparser via SSH, en utilisant« feedparser import » fonctionne via SSH, mais échoue lorsque dans le navigateur

$ python setup.py install --home=~/httpdocs/python-libraries/feedparser-4.1/ 

Je l'ai fait parce que je ne semble pas avoir l'autorisation d'exécuter correctement « python setup.py install '

Je cours le code python suivant dans' test.py '.

print "Content-type: text/html\n\n" 
try: 
    import feedparser 
except: 
    print "Cannot import feedparser.\n" 

Le code fonctionne correctement lorsque je suis connecté par SSH. Mais quand je l'ai vue dans un navigateur, il imprime

Cannot import feedparser.

Toutes les idées?

Répondre

0

J'ai essayé deux sys.path et les solutions $PYTHONPATH, mais ils ne semblent pas fonctionner. Je n'ai pas essayé d'ajouter PythonPath à httpd.conf ou python.conf - cela aurait pu fonctionner.

J'ai fini par demander à un utilisateur root de lancer # python setup.py install pour moi. Ça a marché.

J'utilisais Python 2.3.

3

Cela ressemble à un problème PYTHONPATH. Essayez de changer le code à cela et voir ce qui se passe:

import sys 
print "Content-type: text/html\n\n" 
try: 
    print sys.path 
    import feedparser 
except: 
    print "Cannot import feedparser.\n" 
    print sys.path 

Ce sera probablement montrer que votre ~/httpdocs/python-bibliothèques/répertoire est pas dans le chemin et vous devrez soit le changement sys.path ou Arrage pour une variable d'environnement PYTHONPATH, pour corriger le problème.

Lorsque vous modifiez le chemin, assurez-vous que vous utilisez le nom de répertoire complet, pas le ~ raccourci.

7

Peut-être que c'est le problème avec la configuration correcte sys.path lors de l'exécution de shell vs serveur Web.

En savoir plus sur sys.path ici: sys module.

Je recommanderais d'essayer d'ajouter ~/httpdocs/python-libraries/feedparser-4.1/ (mieux en utilisant le chemin complet, sans ~/) à votre sys.path avant l'importation.

import sys 
sys.path.append('/home/user/httpdocs/python-libraries/feedparser-4.1/') 
print "Content-type: text/html\n\n" 
try: 
    import feedparser 
except: 
    print "Cannot import feedparser.\n" 

Oh, et par la manière, le httpdocs semble comme une racine de documents pour votre serveur web. Est-ce la meilleure idée d'y mettre la bibliothèque? (Bien, à moins qu'il y est le seul endroit où vous pouvez utiliser ...)


modifier (comme une note générale)

Il est préférable d'éviter la syntaxe comme:

try: 
    something 
except: 
    print "error" 

Cela donne vous absolument aucune information sur l'erreur réelle que vous rencontrez. Vous pouvez supposer que si vous essayez d'importer un module, vous avez ImportError, mais vous ne pouvez en être sûr.

Cela fait du débogage un véritable enfer. Été là, fait cela, ont perdu des dizaines d'heures à cause de cela :)

Chaque fois que vous le pouvez, essayez d'attraper un type d'exception à la fois. Alors:

try: 
    import SomeModule 
except ImportError: 
    print "SomeModule can't be imported" 

Vous pouvez également vous familiariser avec le module traceback. C'est dans la bibliothèque standard et c'est là que vous pouvez l'utiliser.Donc, votre code de gestion des exceptions pourrait être quelque chose comme ceci:

sys.path.append('/home/user/httpdocs/python-libraries/feedparser-4.1/') 
try: 
    import feedparser 
except ImportError: 
    print "Content-type: text/plain\n\n" # text/plain so we get the stacktrace printed well 
    import traceback 
    import sys 
    traceback.print_exc(sys.stdout) # default is sys.stderr, which is error log in case of web server running your script, we want it on standart output 
    sys.exit(1) 
# here goes your code to execute when all is ok, including: 
print "Content-type: text/html\n\n" 
+0

Astuce géniale à propos du module de retraçage. Merci! – Pranab

0

Plutôt que d'attraper vous-même l'exception, utilisez le module cgitb juste une fois en haut de votre programme, et vous obtiendrez de meilleures informations sur toutes les erreurs.

import cgitb 
cgitb.enable()