Почему Python не может найти некоторые модули, когда я запускаю CGI-скрипты из Интернета? - PullRequest
6 голосов
/ 24 сентября 2010

Понятия не имею, в чем может быть проблема:

У меня есть несколько модулей из Biopython, которые я могу легко импортировать при использовании интерактивного приглашения или выполнении сценариев Python из командной строки.

Проблема в том, что когда я пытаюсь импортировать те же модули биопиона в веб-исполняемый скрипт cgi, я получаю «Ошибка импорта»

: нет модуль с именем Bio

Есть идеи здесь?

Ответы [ 3 ]

5 голосов
/ 24 сентября 2010

Вот несколько возможностей:

  • Apache (в Unix) обычно запускается от имени пользователя и из другой среды для запуска Python из командной строки.Попробуйте создать небольшой скрипт, который просто печатает sys.version и sys.prefix, и сравните результат через apache и через командную строку, чтобы убедиться, что вы используете одну и ту же установку python в обеих средах.
  • Установлен ли Biopython в вашем домашнем каталоге или доступен для чтения только для обычного пользователя?Опять же, поскольку apache обычно работает от имени другого пользователя, возможно, у вас нет доступа к этому местоположению, поэтому вы не можете его импортировать.
  • Можете ли вы попробовать import site перед попыткой импортировать Biopython?Возможно, что-то мешает импорту пакетов сайта при запуске через apache.
4 голосов
/ 24 сентября 2010

В сценарии cgi вы можете попытаться добавить путь к этому пакету перед любым импортом.

sys.path.insert(0, 'path to biopython package')

Если вы используете Apache, вы можете установить PYTHONPATH в файле conf с директивой SetEnv

SetEnv PYTHONPATH "path to biopython package"
0 голосов
/ 23 февраля 2019

У меня была такая же проблема.Я решил эту проблему, изменив пользователя Apache в Linux Ubuntu с помощью команды в терминале:

sudo gedit /etc/apache2/envvars

Пожалуйста, измените www-data на export APACHE_RUN_USER и export APACHE_RUN_GROUP на текущего пользователя или пользователя, который можетзапустить скрипт python. Хорошо провести время;)

...