apache / mod_wsgi上的金字塔:ImportError:没有名为registry的模块

时间:2014-05-02 07:44:10

标签: apache mod-wsgi pyramid

我是一个非常新的金字塔学习者,我只是按照文档创建了一个新的金字塔项目:我成功安装了一个带有金字塔1.5包的virtualenv,并使用'pserve'在开发模式下运行项目。

但是,当使用apache + mod_wsgi时,这是另一个故事:我将此错误输入到apache错误日志中:

    [Fri May 02 09:08:53 2014] [error] [client 127.0.0.1]   File "/home/eric/perso/projects/Pyratest/pyramid.wsgi", line 8, in <module>
    [Fri May 02 09:08:53 2014] [error] [client 127.0.0.1]     from pyramid.paster import get_app, setup_logging
...
    [Fri May 02 09:08:53 2014] [error] [client 127.0.0.1]   File "/home/eric/perso/projects/venv/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/threadlocal.py", line 3, in <module>
    [Fri May 02 09:08:53 2014] [error] [client 127.0.0.1]     from pyramid.registry import global_registry
    [Fri May 02 09:08:53 2014] [error] [client 127.0.0.1]   File "/home/eric/perso/projects/venv/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/registry.py", line 5, in <module>
    [Fri May 02 09:08:53 2014] [error] [client 127.0.0.1]     from zope.interface.registry import Components
    [Fri May 02 09:08:53 2014] [error] [client 127.0.0.1] ImportError: No module named registry

我在我的pyramid.wsgi中添加了一个sys.path转储:

import sys

print "=" * 80
for p in sys.path:
    print p

from pyramid.paster import get_app, setup_logging

ini_path = '/home/eric/perso/projects/Pyratest/production.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')

我可以看到apache用户可以访问zope / interface / registry.py的路径。 此路径位于sys.path的最开头,因此在某处不应存在路径冲突。

我的apache虚拟主机定义:

Listen 9999
NameVirtualHost localhost:9999
<VirtualHost localhost:9999>
        ServerAdmin webmaster@localhost

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

        ErrorLog /var/log/apache2/pyramid-test-error.log

        LogLevel warn

        CustomLog /var/log/apache2/pyramid-test-access.log combined
        ServerSignature On

        Alias /static/ /home/eric/perso/projects/Pyratest/pyratest/static/
        <Location "/static/">
                <IfModule mod_deflate.c>
                AddOutputFilterByType DEFLATE text/html text/plain text/xml application/javascript
                </IfModule>
                Options Indexes FollowSymLinks MultiViews
                Order allow,deny
                allow from all
        </Location>

        WSGIApplicationGroup %{GLOBAL}
        WSGIPassAuthorization On
        WSGIDaemonProcess pyramid-test user=eric group=eric processes=4 threads=1 python-path=/home/eric/perso/projects/Pyratest/:/home/eric/perso/projects/venv/lib/python2.7/site-packages
        WSGIProcessGroup pyramid-test
        WSGIScriptAlias / /home/eric/perso/projects/Pyratest/pyramid.wsgi

        <Directory /home/eric/perso/projects/venv>
                WSGIProcessGroup eric
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

当我手动运行venv python解释器时,我可以毫无问题地导入zope.interface.registry。我不明白为什么用mod_wsgi,它不起作用。 我尝试了很多次,通过创建许多venv并通过仅使用easy_install或仅使用pip填充,有或没有--no-site-packages,我已经采用了最新版本的virtualenv,分发,pip,setuptools,但仍然是同样的问题。只有一个常量:只有zope.interface.registry似乎无法访问:为什么这个而不是其他金字塔包?

更新1: registry.py和.pyc是可读的:

eric@pcubuntu:~/perso/projects$ . ./venv/bin/activate
(venv)eric@pcubuntu:~/perso/projects$ python
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import zope.interface.registry
>>> print zope.interface.registry.__file__
/home/eric/perso/projects/venv/lib/python2.7/site-packages/zope.interface-4.1.1-py2.7-linux-x86_64.egg/zope/interface/registry.pyc
>>> 

(venv)eric@pcubuntu:~/perso/projects$ ls /home/eric/perso/projects/venv/lib/python2.7/site-packages/zope.interface-4.1.1-py2.7-linux-x86_64.egg/zope/interface/registry.pyc
/home/eric/perso/projects/venv/lib/python2.7/site-packages/zope.interface-4.1.1-py2.7-linux-x86_64.egg/zope/interface/registry.pyc
(venv)eric@pcubuntu:~/perso/projects$ ls -la /home/eric/perso/projects/venv/lib/python2.7/site-packages/zope.interface-4.1.1-py2.7-linux-x86_64.egg/zope/interface/registry.pyc
-rw-rw-r-- 1 eric eric 25127 mai    2 08:54 /home/eric/perso/projects/venv/lib/python2.7/site-packages/zope.interface-4.1.1-py2.7-linux-x86_64.egg/zope/interface/registry.pyc
(venv)eric@pcubuntu:~/perso/projects$ ls -la /home/eric/perso/projects/venv/lib/python2.7/site-packages/zope.interface-4.1.1-py2.7-linux-x86_64.egg/zope/interface/registry.py
-rw-rw-r-- 1 eric eric 18877 mai    2 08:54 /home/eric/perso/projects/venv/lib/python2.7/site-packages/zope.interface-4.1.1-py2.7-linux-x86_64.egg/zope/interface/registry.py

更新2:以下是已安装的软件包:

(venv)eric@pcubuntu:~/perso/projects/venv$ pip freeze
Chameleon==2.15
Mako==0.9.1
MarkupSafe==0.21
PasteDeploy==1.5.2
Pygments==1.6
Pyratest==0.0
WebOb==1.3.1
argparse==1.2.1
pyramid==1.5
pyramid-chameleon==0.1
pyramid-debugtoolbar==2.0.2
pyramid-mako==1.0.2
repoze.lru==0.6
translationstring==1.1
venusian==1.0a8
waitress==0.8.8
wsgiref==0.1.2
zope.deprecation==4.1.1
zope.interface==4.1.1

更新3 :我终于找到了一种启动金字塔的方法,但是我不能将其视为一种解决方案:

- use pip install instead of easy_install
- add "import pip" at the top of the pyramid.wsgi file    (!!!)

更新4 :我重做了Running a Pyramid Application under mod_wsgi文档的确切过程,即:一个modwsgi目录,一个virtualenv,最后是virtualenv中的Pyratest:仍然是同样的事情:无法使用apache mod_wsgi:ImportError:没有名为registry

的模块

更新5 :我决定使用vagrant从头开始安装一个全新的ubuntu 12.04,通过这种方式,一切正常。所以问题是为什么它不适用于我常用的桌面:对于两者而言,它都不起作用......我对它们运行Django没有任何问题,可能有一些与金字塔冲突的调整......

4 个答案:

答案 0 :(得分:2)

我终于找到了办法:

问题是:mod_wsgi在virtualenv中不提供与python相同的sys.path。 要修复我在pyramid.wsgi顶部添加的内容:

import sys
sys.path = [
    '/home/eric/perso/projects/venv/lib/python2.7/lib-dynload',
    '/usr/lib/python2.7',
]


activate_this = '/home/eric/perso/projects/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

答案 1 :(得分:1)

如果您尚未阅读,请提供Running a Pyramid Application under mod_wsgi的官方教程。

答案 2 :(得分:0)

你得到了什么:

import zope.interface.registry
print(zope.interface.registry.__file__)

在命令行Python中运行时?

换句话说,它实际存在于哪里?

您使用的是什么版本的mod_wsgi?


更新1

你说基于__file__它存在于:

/home/eric/perso/projects/venv/lib/python2.7/site-packages

您添加到site-packages指令的python-path选项的WSGIDaemonProcess目录不匹配,而是使用:

/home/eric/perso/projects/venv/local/lib/python2.7/site-packages

也许你应该让python-path的目录匹配。

答案 3 :(得分:0)

阅读these guidelines之后,我建议将你的python项目Pyratest移动到你的virtualenv。

home/eric/perso/projects/venv/Pyratest/

这可以解决有关权限的几个问题。这样mod_wsgi 目录指令适用于你的python项目 AND 你的virtualenv。此目录布局符合引用的金字塔菜谱文章和常见的金字塔脚手架用法。您当前的mod_wsgi设置仅适用于virtualenv,而不适用于您的Pyratest目录。

我进一步将WSGIDaemonProcess和WSGIProcessGroup更改为pyramid以符合cookbook文章。根据您自己的pip freeze包,Pyratest使用python setup.py develop安装在virtualenv中。因此,我们只需要将一个目录传递给python-path参数。现在这个设置看起来类似于食谱中的那个。确保apache usereric也可以进入这些目录。

    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    WSGIDaemonProcess pyramid user=eric group=eric processes=4 threads=1 python-path=/home/eric/perso/projects/venv/lib/python2.7/site-packages
    WSGIScriptAlias / /home/eric/perso/projects/venv/Pyratest/pyramid.wsgi

    <Directory /home/eric/perso/projects/venv>
            WSGIProcessGroup pyramid
            Order allow,deny
            Allow from all
    </Directory>

我的建议是从头开始创建一个新的venv。在你得到之后,再次重复它以确保你的假设有效。祝你好运

为了进一步调试,我建议mod_wsgi basic docs逐步构建mod_wsgi设置。