Нет модуля с именем deploy при попытке запустить приложение пирамиды с mod_wsgi

пытаюсь использовать mod_wsgi в первый раз для своего приложения пирамиды, но я продолжаю получать ImportError: No module named deploy, когда пытаюсь получить доступ к сайту

in my /etc/apache2/sites-available/domain.com

<VirtualHost *:80>  
    ServerName domain.com
    ServerAlias www.domain.com
    ServerAdmin [email protected]
    DocumentRoot /data/app
    ErrorLog /data/app/apache_error.log

    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    WSGIDaemonProcess pyramid user=www-data group=www-data \
        processes=2 threads=4 \
        python-path=/data/app/lib/python2.6/site-packages/
    WSGIScriptAlias / /data/app/pyramid.wsgi

    <Directory /data/app>
        WSGIProcessGroup pyramid
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

in /data/app/pyramid.wsgi

venv = '/data/app/bin/activate_this.py'
execfile(venv, dict(__file__=venv))

ALLDIRS = ['/data/app/lib/python2.6/site-packages']

import sys, site, os

site.addsitedir('/data/app/lib/python2.6/site-packages')

sys.path.append('/data/app/app')
os.environ['PYTHON_EGG_CACHE'] = '/data/app/python-eggs'

from pyramid.paster import get_app, setup_logging
ini_path = '/data/app/app/development.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')

когда я пытаюсь получить доступ к domain.com в своем браузере, я получаю сообщение об ошибке The server encountered an internal error or misconfiguration and was unable to complete your request. Вот распечатка моего журнала ошибок

[Mon Apr 22 20:43:13 2013] [error] test
[Mon Apr 22 20:43:13 2013] [error] mod_wsgi (pid=6795): Target WSGI script '/data/app/pyramid.wsgi' cannot be loaded as Python module.
[Mon Apr 22 20:43:13 2013] [error] mod_wsgi (pid=6795): Exception occurred processing WSGI script '/data/app/pyramid.wsgi'.
[Mon Apr 22 20:43:13 2013] [error] Traceback (most recent call last):
[Mon Apr 22 20:43:13 2013] [error]   File "/data/app/pyramid.wsgi", line 30, in <module>
[Mon Apr 22 20:43:13 2013] [error]     from pyramid.paster import get_app, setup_logging
[Mon Apr 22 20:43:13 2013] [error]   File "/data/app/lib/python2.6/site-packages/pyramid-1.4-py2.6.egg/pyramid/paster.py", line 3, in <module>
[Mon Apr 22 20:43:13 2013] [error]     from paste.deploy import (
[Mon Apr 22 20:43:13 2013] [error] ImportError: No module named deploy

Обратите внимание, что test в первой строке напечатано из моего вручную добавленного print 'test' в верхней части /data/app/lib/python2.6/site-packages/pyramid-1.4-py2.6.egg/pyramid/paster.py, чтобы убедиться, что он загружается из файла, который я ожидал...

теперь, если я запущу приложение из сохранения

$ /bin/pserve app/development.ini --reload

приложение запущено успешно, журнал консоли ниже

test
Starting subprocess with file monitor
test
Starting server in PID 9132.
serving on http://0.0.0.0:6543

Я также пытался напрямую зайти в python, чтобы импортировать paster.py, тоже без проблем.

$ cd /data/app/lib/python2.6/site-packages/pyramid-1.4-py2.6.egg/pyramid/
$ /data/app/bin/python
Python 2.6.5 (r265:79063, Oct  1 2012, 22:04:36)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyramid.paster as p
test
>>> print p.__file__
/data/app/lib/python2.6/site-packages/pyramid-1.4-py2.6.egg/pyramid/paster.pyc
>>>

разрешения тоже должны быть в порядке

$ ls /data/app -l
-rw-rw-r-- 1 root www-data 4148 2013-04-22 21:06 apache_error.log
drwxrwsr-x 4 root www-data 4096 2013-04-22 12:05 app
drwxrwsr-x 2 root www-data 4096 2013-04-22 12:04 bin
drwxrwsr-x 2 root www-data 4096 2013-04-22 11:58 include
drwxrwsr-x 3 root www-data 4096 2013-04-22 11:58 lib
-rwxrwxr-x 1 root www-data  893 2013-04-22 12:23 pyramid.wsgi
drwxrwsr-x 2 root www-data 4096 2013-04-22 12:07 python-eggs

что мне не хватает? Спасибо!

Изменить www-data также является правильным пользователем

$ ps aux | grep apache2
root      2599  0.0  1.4 185200 14552 ?        Ss   10:00   0:02 /usr/sbin/apache2 -k start
www-data  9064  0.0  0.8 185664  8940 ?        Sl   21:06   0:00 /usr/sbin/apache2 -k start
www-data  9065  0.0  0.8 185664  8940 ?        Sl   21:06   0:00 /usr/sbin/apache2 -k start
www-data  9095  0.0  1.1 187292 11388 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
www-data  9096  0.0  1.1 187292 11388 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
www-data  9097  0.0  1.0 186768 10472 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
www-data  9098  0.0  1.0 186768 10472 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
www-data  9099  0.0  1.0 186768 10472 ?        S    21:06   0:00 /usr/sbin/apache2 -k start
root      9189  0.0  0.0   7624   912 pts/0    S+   21:42   0:00 grep apache2

Изменить по предложению Грэма, я заменил print 'test' в paste.py на

import paste as p
print p.__path__

распечатка при доступе к сайту через apache была /usr/local/lib/python2.6/dist-packages/paste, а не virtualenv. Я добавил все примеры, которые я мог найти в Интернете, чтобы указать на мой virtualenv в pyramid.wsgi, а также на pythonpath в файле конфигурации apache, но, очевидно, я все еще не понимаю это правильно. Где еще попробовать?


person minovsky    schedule 23.04.2013    source источник
comment
Попробуйте добавить следующее в свой httpd.conf или конфиг, где вы определяете <VirtualHost> (но делайте это вне VirtualHost) WSGIPythonHome /path/to/virtualenv WSGIPythonPath /path/to/virtualenv/lib/python2.6   -  person RedBaron    schedule 25.04.2013
comment
@RedBaron: спасибо! это сработало, однако есть более фундаментальная проблема. Что делать, если у меня более одного приложения (т. е. более одного virtualenv, в первую очередь нужно настроить виртуальный хостинг)? Я не могу определить WSGIPythonHome и WSGIPythonPath несколько раз, верно?   -  person minovsky    schedule 08.05.2013
comment
Рад помочь..... у меня была похожая проблема, когда я мигрировал с одной виртуальной среды на другую.   -  person RedBaron    schedule 09.05.2013


Ответы (3)


Решил наконец. Из журнала консоли видно, что в моей основной установке Python в /usr/local/lib установлен модуль paste, для которого не определен обработчик deploy.

Комментарий RedBaron для установки WSGIPythonHome сработал, но проблема в том, что у меня несколько приложений, поэтому я не могу просто глобально указать WSGIPythonHome на виртуальную среду конкретного приложения.

Как бы то ни было, я снова просмотрел mod_wsgi документов по virtualenv (https://code.google.com/p/modwsgi/wiki/VirtualEnvironments#Baseline_Environment) и увидел, что WSGIPythonHome должно указывать на "девственную среду". буквально

$ virtualenv --no-site-packages BASELINE

а затем указывая WSGIPythonHome

WSGIPythonHome /usr/local/pythonenv/BASELINE

и укажите WSGIDaemonProcess на виртуальную среду моего приложения (что я уже сделал в начале)

УРОКИ. Уделяйте больше внимания документации...


Наконец, мой pyramid.wsgi можно значительно упростить до следующего

import os
os.environ['PYTHON_EGG_CACHE'] = '/data/app/python-eggs'

from pyramid.paster import get_app, setup_logging
ini_path = '/data/app/app/development.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')
person minovsky    schedule 08.05.2013

В моем случае переустановка PasteDeploy в виртуальной среде устранила проблему, но не знаю почему.

person mdob    schedule 16.02.2016

Ошибка указывает на то, что пакет PasteDeploy не установлен.

person Graham Dumpleton    schedule 23.04.2013
comment
Спасибо за ваш ответ. Если это так, то как это объясняет, почему запуск с pserve, который загружает тот же скрипт, выполняется успешно? тем не менее, я попробовал $ bin/pip install pastedploy и получил Requirement already satisfied (use --upgrade to upgrade): pastedeploy in ./lib/python2.6/site-packages/PasteDeploy-1.5.0-py2.6.egg Cleaning up... - person minovsky; 23.04.2013
comment
Напишите приветственную программу WSGI, которая импортирует «вставить» и распечатывает «вставить.__файл__». Это исходит оттуда, откуда вы ожидаете? - person Graham Dumpleton; 23.04.2013
comment
еще раз спасибо! Я заменил print test на import paste as p print p.__path__. не знаю, почему такая простая проверка ускользнула от меня ... но действительно apache не получает правильный paste, распечатка была '/usr/local/lib/python2.6/dist-packages/paste' я добавил все примеры, чтобы указать на мой virtualenv в pyramid.wsgi, а также pythonpath в конфигурации apache файл ... где я делаю это неправильно? - person minovsky; 23.04.2013