0

我在我的 Mac 上本地运行 Flask 服务器。

我的项目:

project/my_lib/my_class.py  
project/testing/flask_server.py  
project/testing/something/test_class.py  

有一次,我尝试使用一些相对导入来测试不同目录中的类:

project/testing/something/test_class.py 中:

from ..my_lib.my_class import MyClass

这给了我一个错误:

ValueError: Attempted relative import beyond toplevel package

所以我放弃了,但现在我无法让我的 Flask 服务器运行,即使我消除了新的导入代码。

$ python testing/flask_server.py

吐出这个:

Traceback (most recent call last):
  File "testing/flask_server.py", line 2, in <module>
    from flask import Flask
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/flask/__init__.py", line 17, in <module>
    from werkzeug.exceptions import abort
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/werkzeug/__init__.py", line 154, in <module>
    __import__('werkzeug.exceptions')
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/werkzeug/exceptions.py", line 71, in <module>
    from werkzeug.wrappers import Response
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/werkzeug/wrappers.py", line 26, in <module>
    from werkzeug.http import HTTP_STATUS_CODES, \
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/werkzeug/http.py", line 28, in <module>
    from urllib.request import parse_http_list as _parse_list_header
ImportError: No module named request

嗯?


更新:

烧瓶导入错误仅发生在最初调用错误代码的目录中。也就是说,如果我这样做

from flask import Flask

项目/测试目录中的任何地方,我都会收到导入错误,但是如果我在项目/或系统上的其他任何地方执行此操作,那很好..?


解决方案(部分):

我没有解释为什么会发生这种情况,但我做了以下修复它:

  1. 创建一个新的testing/目录并将旧目录中的文件复制到其中。必须删除旧的testing/目录 - 它基本上已损坏。
  2. 我的跨目录导入是否使用绝对路径而不是相对路径。

(顺便说一句,我试图追溯我的步骤以重现相关导入错误但无法重现,因此我不确定整个事情的原因或解决方案。)

4

1 回答 1

2

您可能在系统路径中有自己的urllib2python 文件,可能在本地目录中。不要那样做,因为它会破坏werkzeug(和其他 python 代码)。

为了与 python 2 和 3 兼容,werkzeug使用如下结构:

try:
    from urllib2 import parse_http_list as _parse_list_header
except ImportError: # pragma: no cover
    from urllib.request import parse_http_list as _parse_list_header

如果您有一个屏蔽标准库文件的本地模块或包,该from urllib2 import parse_http_list as _parse_list_header行可能会引发异常。ImportErrorurllib2.pyurllib2/__init__.py

因为第一次导入抛出一个ImportError,所以执行了第二行,这失败了,因为该urllib.request包仅在 Python 3 上可用。

在您的项目中,运行以下代码来诊断拥有该模块的位置:

import urllib2
print urllib2.__file__

如果仍然有效,则运行:

from urllib2 import parse_http_list as _parse_list_header

因为它可能urllib2间接地导入了你掩盖的东西。urllib2例如使用from urlib import ...语句,因此本地urllib模块也会中断导入。

从你的烧瓶项目中执行此操作很重要,就from flask import Flask在行之前。

于 2013-06-30T14:22:41.743 回答