2014-05-02 16 views
1

我是一个非常新的金字塔学习者,我只是按照创建一个新的金字塔项目的文档:我成功地安装了包含金字塔1.5包的virtualenv并运行项目发展模式与'pserve'。apache/mod_wsgi上的金字塔:ImportError:没有模块命名的注册表

但是,使用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 

我加了sys.path中转储到我pyramid.wsgi:

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 [email protected] 

     <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,distribute,pip,setuptools,但仍然一样问题。只有一个常量:只有zope.interface.registry似乎无法访问:为什么这个而不是其他金字塔包?

UPDATE 1:的registry.py和pyc文件是可读:

[email protected]:~/perso/projects$ . ./venv/bin/activate 
(venv)[email protected]:~/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)[email protected]:~/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)[email protected]:~/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)[email protected]:~/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)[email protected]:~/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:还是一样的东西:不阿帕奇mod_wsgi的工作:导入错误:没有模块命名注册表

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

回答

2

我终于找到了一个方法:

的问题是:mod_wsgi的不提供相同的sys.path中的virtualenv蟒。 要修复我在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)) 
+0

该死的......这真是丑陋,但我自己也碰到过这种情况,不得不应用类似的可怕黑客攻击来重新开始工作重建venv);顺便说一下,在我的情况下,这个项目已经在venv下了,我已经按照指南在mod_wsgi下运行Pyramid了。非常感谢发布解决方案(尽管我一定希望找到更清洁的解决方案!) –

+0

看起来有一个[稍微更清洁的选项](http://blog.dscpl.com.au/2014/09/using- python-virtual-environments-with.html),但它取决于比我目前得到的更新版本的mod_wsgi –

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比赛。

+0

是的,当然该文件存在另外,如我说,它是由mod_wsgi的可读 – Eric

+0

mod_wsgi版本:3.3(最新的Ubuntu 12.04) – Eric

+0

不幸的是,我已经注意到了。virtualenv生成从local/lib/*到lib/*的符号链接:因此venv/local/lib和venv/lib是等效的。另外只有zope.interface.repository出现了问题,而其他人不会使用相同的python路径 – Eric

0

看完后these guidelines我建议将你的python项目Pyratest移到你的virtualenv中。

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

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

我进一步将WSGIDaemonProcess和WSGIProcessGroup更改为pyramid以符合食谱文章。根据您的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设置一步一步。

+0

不幸的是,我已经注意到了。virtualenv生成符号来自lo的链接cal/lib/*到lib/*:所以venv/local/lib和venv/lib是等效的。另外,只有zope.interface.repository出现问题,而不是其他用户使用相同的python路径 – Eric

+0

zope.interface.repository有什么问题?你的意思是zope.interface.registry?请解释! –

+0

对不起,这是一个拼写错误:我的意思是zope.interface.registry – Eric

相关问题