没有名为“zope.deprecation”的模块,带有简单的 hello world 金字塔应用程序

Posted

技术标签:

【中文标题】没有名为“zope.deprecation”的模块,带有简单的 hello world 金字塔应用程序【英文标题】:No module named 'zope.deprecation' with simple hello world pyramid app 【发布时间】:2017-07-10 04:04:25 【问题描述】:

我正在尝试学习如何将金字塔应用程序部署到 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 安装金字塔

检查 pip freeze 并且它存在并且在正确的 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。

我尝试过的其他事情:

清空整个应用,然后重试。 在新应用上尝试了 Pyramid 1.7 和 zope.deprecation 4.1.2。 尝试使用 requirements.txt 文件。

最后一个步骤使 python 能够识别 zope.deprecation。应用程序仍然无法运行,因为它已返回

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

不确定这是否是进步。

更新

让它工作。我认为秘诀在于回滚版本,添加 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()

我会尝试并希望添加更好的答案。

【问题讨论】:

一天前发布的 Pyramid 1.8.2 可能是一个错误。您是否尝试过使用 Pyramid 的较旧稳定版本? 回滚到 1.7 并且还将 zope.deprecation 滚动到 4.1.2 并且没有好处。我还尝试将它们放入 requirements.txt 文件并推出一个新应用程序。 @webjunkie 你是对的......有点。事实证明 zope.deprecation 的版本是原因。它正在安装带有金字塔 1.8.1 和轰炸的 4.2。我安装了 4.1.2 和 1.8.1 工作。我仍然需要找出原因。 【参考方案1】:

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

【讨论】:

我使用的是单文件 python 脚本,所以没有 setup.py。我也很想尝试这种方法。【参考方案2】:

我还没有理由,但快速的回答是我需要使用 zope.deprecation 4.1.2。 4.2 版导致了问题。

【讨论】:

如果是这样,那我就更确定我的回答了,因为这显然是某种安装问题。 是的,绝对是安装问题,但我已经尝试使用 requirements.txt 和手动安装 zope.deprecation 4.1.2 和 pyramid 1.8.1(按此顺序)进行安装,并且它作品。不幸的是,调试 4.2 对我来说不是一个关键问题,因此找出发生的事情在我的待办事项列表中很少。

以上是关于没有名为“zope.deprecation”的模块,带有简单的 hello world 金字塔应用程序的主要内容,如果未能解决你的问题,请参考以下文章

没有名为“硒”的模块

macOS 上的“ModuleNotFoundError:没有名为 'dbus' 的模块”

没有名为“email.FeedParser”的模块

ModuleNotFoundError:没有名为“推理”的模块

为啥 ImportError:没有名为 lightgbm 的模块

导入错误,没有名为'jwt'的模块。没有名为 "jwt "的模块