我是一个非常新的金字塔学习者,我只是按照文档创建了一个新的金字塔项目:我成功安装了一个带有金字塔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没有任何问题,可能有一些与金字塔冲突的调整......
答案 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 user
和eric
也可以进入这些目录。
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设置。