【问题标题】:Flake8 Attribute Error: 'module' object has no attribute 'normalize_paths'Flake8 属性错误:“模块”对象没有属性“normalize_paths”
【发布时间】:2016-09-29 10:06:47
【问题描述】:

这是我在验证期间输出的flake8

Traceback (most recent call last):
  File "/usr/local/bin/flake8", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/flake8/main.py", line 25, in main
    flake8_style = get_style_guide(parse_argv=True, config_file=DEFAULT_CONFIG)
  File "/usr/local/lib/python2.7/dist-packages/flake8/engine.py", line 244, in get_style_guide
    options.exclude.extend(pep8.normalize_paths(EXTRA_EXCLUDE))
AttributeError: 'module' object has no attribute 'normalize_paths'

为什么我不能使用它?

【问题讨论】:

    标签: python emacs flymake flake8 elpy


    【解决方案1】:

    这个问题可以通过使用最新版本的flake8 来解决,特别是flake8 &gt;= 2.6.0,它不再依赖pep8 模块(Source)。你可以通过 pip 安装它:

    $ pip install flake8
    

    应该安装最新版本(目前是 3.5.0)。

    出了什么问题?

    这个错误告诉你 flake8 确实找到了一个名为 pep8 的模块,但该模块不包含一个名为 normalize_paths 的函数。这可能有多种原因,包括安装损坏(应该通过重新安装 flake 和 pep8 来修复)以及路径中 pep8 的冲突版本。当您modify your sys.path 和/或以某种方式设法将自己的名为 pep8 的模块放入您的路径时,可能会发生后者。这可以是一个名为 pep8 且带有 __init__.py 的文件夹,如下例所示:

    $ mkdir /home/me/miniconda3/envs/fl8/lib/python2.7/site-packages/pep8
    $ touch /home/me/miniconda3/envs/fl8/lib/python2.7/site-packages/pep8/__init__.py
    $ flake8 foo.py
    
    Traceback (most recent call last):
      File "/home/me/miniconda3/envs/fl8/bin/flake8", line 7, in <module>
        from flake8.main import main
      File "/home/me/miniconda3/envs/fl8/lib/python2.7/site-packages/flake8/main.py", line 8, in <module>
        from flake8.engine import get_parser, get_style_guide
      File "/home/me/miniconda3/envs/fl8/lib/python2.7/site-packages/flake8/engine.py", line 11, in <module>
        from flake8.reporter import (multiprocessing, BaseQReport, FileQReport,
      File "/home/me/miniconda3/envs/fl8/lib/python2.7/site-packages/flake8/reporter.py", line 18, in <module>
        class BaseQReport(pep8.BaseReport):
    AttributeError: 'module' object has no attribute 'BaseReport'
    

    如您所见,此错误与您的错误略有不同,但属于同一类型。这可能是由于 pep8 模块中的微小变化造成的。

    要查看是否一切顺利,您可以检查 python 路径的内容和 pep8 模块的位置。

    $ python
    >>> import pep8
    >>> pep8.__file__
    /home/me/miniconda3/envs/fl8/lib/python3.5/site-packages/pep8.py
    

    这会告诉您 Python 正在使用哪个 pep8 模块。因此,这应该指向您的 Python 发行版中的某个位置,而不是指向您的本地文件夹之一。如果它确实指向您的文件,这是您的sys.path 的问题,python 在导入期间检查的路径列表:

    >>> import sys
    >>> import pprint  # this is only used to make it print pretty
    >>> pprint.pprint(sys.path)
    ['',
     '/home/me/miniconda3/envs/dptest/lib/python35.zip',
     '/home/me/miniconda3/envs/dptest/lib/python3.5',
     '/home/me/miniconda3/envs/dptest/lib/python3.5/plat-linux',
     '/home/me/miniconda3/envs/dptest/lib/python3.5/lib-dynload',
     '/home/me/miniconda3/envs/dptest/lib/python3.5/site-packages',
     '/home/me/miniconda3/envs/dptest/lib/python3.5/site-packages/setuptools-27.2.0-py3.5.egg']
    

    这显示了 Python 在其中搜索 pep8 模块的所有文件夹(从上到下)。因此,如果其中有一条路径确实指向您不希望 python 包存在的位置,那可能是罪魁祸首。

    (延伸阅读:reddit thred

    其他可能的解决方案

    如果使用最新版本不能解决您的问题,您可以尝试使用 conda 创建一个虚拟环境,您可以在其中安装 flake8 及其所有依赖项,以避免与 python 安装的其他部分交互。下载conda后,新建一个环境(我的叫fl8),激活,安装flake8,使用:

    $ conda create -n fl8 python=2.7  # if you insist on python 2.7
    $ source activate fl8
    (fl8) $ pip install flake8
    [...]
    $ flake8 foo.py
    

    关于 Emacs

    如果您从命令行启动 Emacs,它将使用与您启动它的 shell 相同的环境。所以为了从环境中使用 flake8,就像上面一样,你必须先激活环境。我在this tutorial 之后使用elpy 设置了我的Emacs。为了使它与 conda 一起工作,我还在根环境中安装了 flake 等。

    如果您以不同的方式启动 Emacs(例如在 Ubuntu 上使用 M-F2 或从开始菜单),环境可能无法正常工作。我还不完全明白如何解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      相关资源
      最近更新 更多