没有名为' zope.deprecation'使用简单的hello world pyramid app

时间:2017-02-20 18:36:57

标签: python amazon-web-services pyramid

我正在尝试学习如何将金字塔应用程序部署到AWS(Elastic Beanstalk),我正在逐步采用它,但我陷入困境。我使用hello world app以保持简单,但我收到以下错误,我不知道原因:

[Mon Feb 20 18:08:33.477650 2017] [:error] [] mod_wsgi (pid=2811): Target WSGI script '/opt/python/current/app/application.py' cannot be loaded as Python module.
[Mon Feb 20 18:08:33.477918 2017] [:error] [] mod_wsgi (pid=2811): Exception occurred processing WSGI script '/opt/python/current/app/application.py'.
[Mon Feb 20 18:08:33.478124 2017] [:error] [] [remote 69.127.251.49:45648] Traceback (most recent call last):
[Mon Feb 20 18:08:33.478329 2017] [:error] []   File "/opt/python/current/app/application.py", line 2, in <module>
[Mon Feb 20 18:08:33.478440 2017] [:error] []     from pyramid.config import Configurator
[Mon Feb 20 18:08:33.478630 2017] [:error] []   File "/opt/python/run/venv/lib/python3.4/site-packages/pyramid/config/__init__.py", line 12, in <module>
[Mon Feb 20 18:08:33.478745 2017] [:error] []     from pyramid.interfaces import (
[Mon Feb 20 18:08:33.478923 2017] [:error] []   File "/opt/python/run/venv/lib/python3.4/site-packages/pyramid/interfaces.py", line 1, in <module>
[Mon Feb 20 18:08:33.479050 2017] [:error] []     from zope.deprecation import deprecated
[Mon Feb 20 18:08:33.479213 2017] [:error] [] ImportError: No module named 'zope.deprecation'

我尝试部署的代码如下。我是通过控制台上传的。

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response


def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/hello/{name}')
    config.add_view(hello_world, route_name='hello')
    application = config.make_wsgi_app()
    server = make_server('', 8000, application)
    server.serve_forever()

我采取的步骤:

SSH通过

进入实例并安装了金字塔
  

sudo / opt / python / run / venv / bin / pip install pyramid

检查了pip冻结,它存在并存在于正确的venv

(venv)[ec2-user@ ~]$ pip list
hupper (0.4.2)
PasteDeploy (1.5.2)
pip (7.1.2)
pyramid (1.8.2)
repoze.lru (0.6)
setuptools (18.4)
translationstring (1.3)
venusian (1.0)
WebOb (1.7.1)
zope.deprecation (4.2.0)
zope.interface (4.3.3)

(venv)[ec2-user@ ~]$ pip --version
pip 7.1.2 from /opt/python/run/venv/local/lib/python3.4/site-packages(python 3.4)

我试图直接从python调用模块而没有成功

(venv)[ec2-user@ ~]$ python
Python 3.4.3 (default, Sep  1 2016, 23:33:38) 
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from zope.deprecation import deprecation
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'zope.deprecation'
>>> 

有趣的是,help('modules')没有显示它,但确实显示金字塔。 我也尝试过直接安装它。该模块位于/opt/python/run/venv/local/lib/python3.4/site-packages。

我没有想法,我很想放弃这种方法并尝试使用EB CLI。

这听起来像我错过了一些非常明显的东西。此外,由于这是一个简单的文件脚本,我没有运行setup.py。

我尝试过的其他事情:

  • 吹掉整个应用,然后重试。
  • 在新的应用上尝试过金字塔1.7和zope.deprecation 4.1.2。
  • 尝试使用requirements.txt文件。

最后一步使python能够识别zope.deprecation。应用程序仍然无法正常工作

  

目标WSGI脚本&#39; /opt/python/current/app/application.py'不包含WSGI应用程序&#39;应用程序&#39;。

不确定这是否有进展。

更新

GOT IT WORKING。我认为秘诀是回滚版本,添加一个requirements.txt,并在application.py中更改应用程序变量的位置。

application.py现在看起来像

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response


def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

config = Configurator()
config.add_route('hello', '/hello/{name}')
config.add_view(hello_world, route_name='hello')
application = config.make_wsgi_app()

if __name__ == '__main__':  
    server = make_server('', 8000, application)
    server.serve_forever()

我将进行实验并希望添加更好的答案。

2 个答案:

答案 0 :(得分:2)

由于每个系统如何处理命名空间包(如setup.py <foo>),因此在将pip install <bar>zope.XXX混合时会经常发生这类错误。解决方案通常是将所有东西吹走,然后仅使用一个工具进行安装。例如,如果您现在正在使用python setup.py develop,请将其替换为pip install -e .

答案 1 :(得分:0)

我还没有理由,但快速回答是我需要使用zope.deprecation 4.1.2。版本4.2导致事情破裂。