import feedparser работает через SSH, но не работает в браузере - PullRequest
1 голос
/ 18 ноября 2009

Я установил feedparser через SSH, используя

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

Я сделал это, потому что у меня нет прав для правильного запуска python setup.py install '

Я запускаю следующий код Python в 'test.py'.

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

Код работает нормально, когда я вошел в систему по SSH. Но когда я просматриваю его в браузере, он печатает

Cannot import feedparser.

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 18 ноября 2009

Возможно, это проблема с правильной настройкой sys.path при запуске из оболочки против веб-сервера.

Подробнее о sys.path здесь: sys module .

Я бы рекомендовал попытаться добавить ~/httpdocs/python-libraries/feedparser-4.1/ (лучше всего использовать полный путь, без ~/) в ваш sys.path перед импортом.

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"

Да, и, кстати, httpdocs выглядит как корневой документ для вашего веб-сервера. Это лучшая идея, чтобы поместить библиотеку туда? (ну, если нет единственного места, которое вы можете использовать ...)


редактировать (как общее примечание)

Лучше всего избегать синтаксиса, например:

try:
  something
except:
  print "error"

Это не дает вам абсолютно никакой информации о фактической ошибке, с которой вы столкнулись. Вы можете предположить, что если вы попытаетесь импортировать модуль, у вас там будет ImportError, но вы не уверены.

Это делает отладку настоящим адом. Будучи там, сделал это, потерял десятки часов из-за этого:)

Всякий раз, когда вы можете, попробуйте ловить один тип исключения за раз. Итак:

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

Вы также можете ознакомиться с модулем traceback . Это в стандартной библиотеке, и это там, чтобы вы могли использовать его. Итак, ваш код обработки исключений может выглядеть примерно так:

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"
3 голосов
/ 18 ноября 2009

Звучит как проблема PYTHONPATH. Попробуйте изменить код на это и посмотрите, что произойдет:

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

Вероятно, это покажет, что ваш каталог ~ / httpdocs / python-library / не находится в пути, и вам нужно либо изменить sys.path, либо указать arrage для переменной среды PYTHONPATH, чтобы исправить проблему.

Когда вы меняете путь, убедитесь, что вы используете полное имя каталога, а не ярлык ~.

0 голосов
/ 06 сентября 2010

Вместо того, чтобы ловить исключение самостоятельно, используйте модуль cgitb всего один раз в верхней части вашей программы, и вы получите более полную информацию обо всех ошибках.

import cgitb
cgitb.enable()
0 голосов
/ 19 ноября 2009

Я пробовал решения как sys.path, так и $PYTHONPATH, но, похоже, они не работали. Я не пытался добавить PythonPath к httpd.conf или python.conf - это могло бы сработать.

В итоге я попросил пользователя root запустить для меня # python setup.py install. Это сработало.

Я использовал Python 2.3.

...