我正在尝试使用new-ish Pyramid framework构建应用程序。我是金字塔的新手,不知道Zope做了什么(其重要性将变得明显)。我遵循了基本教程,但是当我尝试运行应用程序时,我得到了这个回溯:
Traceback (most recent call last):
File "tasks.py", line 4, in <module>
from pyramid.config import Configurator
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pyramid-1.2-py2.6.egg/pyramid/__init__.py", line 1, in <module>
from pyramid.request import Request
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pyramid-1.2-py2.6.egg/pyramid/request.py", line 1, in <module>
from zope.deprecation import deprecate
ImportError: No module named deprecation
我尝试使用setuptools安装Pyramid:
sudo easy_install pyramid
其中,其他输出的很多包括:
Searching for zope.deprecation
Reading http://pypi.python.org/simple/zope.deprecation/
Best match: zope.deprecation 3.5.0
Downloading http://pypi.python.org/packages/source/z/zope.deprecation/zope.deprecation-3.5.0.tar.gz#md5=1e7db82583013127aab3e7e790b1f2b6
Processing zope.deprecation-3.5.0.tar.gz
Running zope.deprecation-3.5.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-ZiLy8j/zope.deprecation-3.5.0/egg-dist-tmp-yGFSor
Adding zope.deprecation 3.5.0 to easy-install.pth file
我认为应该涵盖它。
我也试过通过macports安装zope:
sudo port install zope
sudo port install py26-zopeinterface
我还尝试在运行脚本之前运行sudo port load zope
,但没有帮助。
我还尝试从http://pypi.python.org/pypi/zope.interface下载源代码并在目录中手动构建它。
任何想法我做错了什么?
---- ---- EDIT
一个猜测是setuptools将zope组件安装到我系统的默认Python框架(这是一个Enthought发行版)中,但是我的默认python环境是Macports安装的环境,所以Macports zope模块可能有一些但不是全部组件,例如zope.deprecate。
答案 0 :(得分:3)
该文档包含有关如何使用virtualenv安装Pyramid的信息。我非常非常非常建议以这种方式使用virtualenv。已安装在主Python中的系统包将与Pyramid的要求进行奇怪的交互。
答案 1 :(得分:1)
您可能会从更熟悉Pyramid的人那里得到答案,但问题是pyramid.request
取决于zope.deprecation
并且未安装/可用。你需要详细说明“我已经尝试使用...安装zope”,以便我帮助你。
确保您从安装到的同一个python中运行金字塔。如果是这种情况,则应在那里安装zope.deprecation
包。你从python -c "import zope.deprecation ; print import zope.deprecation"
获得了什么?
答案 2 :(得分:0)
我通过安装zope.deprecation OS软件包解决了这个问题:
sudo apt-get install zope.deprecation
答案 3 :(得分:0)
只需重新安装金字塔即可修复。
答案 4 :(得分:0)
我将课程移到子模块时遇到了问题。 问题是软件的另一个组成部分是从“OLD”模块导入类。还有继承的循环问题。
所以解决方案是使用zope.deferredimport。代码如下所示:
import warnings
import zope.deferredimport
warnings.simplefilter("default")
zope.deferredimport.initialize()
zope.deferredimport.deprecated(
"Import from openprocurement.contracting.core.tests.base instead",
BaseContractWebTest='openprocurement.contracting.core.tests.base:BaseContractWebTest',
)
所以现在,当使用“OLD”导入的任何软件组件时 模块没有获得ImportError。类从“NEW”模块导入。警告显示如下:
DeprecationWarning: BaseContractWebTest is deprecated. Import from openprocurement.contracting.core.tests.base instead
就是这样。 zope.deferred的主要部分负责循环导入。这救了我的命。