Python 第8页属性错误:';模块';对象没有属性';规范化#u路径';

Python 第8页属性错误:';模块';对象没有属性';规范化#u路径';,python,emacs,flymake,flake8,elpy,Python,Emacs,Flymake,Flake8,Elpy,以下是我在验证过程中的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_guid

以下是我在验证过程中的
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'
回溯(最近一次呼叫最后一次):
文件“/usr/local/bin/flake8”,第11行,在
sys.exit(main())
文件“/usr/local/lib/python2.7/dist packages/flake8/main.py”,第25行,在main中
flake8\u style=get\u style\u指南(parse\u argv=True,config\u file=DEFAULT\u config)
文件“/usr/local/lib/python2.7/dist packages/flake8/engine.py”,第244行,在《获取样式指南》中
options.exclude.extend(pep8.normalize_路径(EXTRA_exclude))
AttributeError:“模块”对象没有“规范化路径”属性

为什么我不能使用它?

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

$ pip install flake8
应该安装最新版本(目前为3.5.0)

出了什么问题? 此错误告诉您flake8确实找到了名为
pep8
的模块,但该模块不包含名为
normalize\u path
的函数。这可能有多种原因,包括安装中断(在重新安装flake和pep8时应予以修复)以及路径中存在冲突的
pep8
。当您和/或以某种方式设法将自己的名为pep8的模块引入到您的路径中时,可能会发生后一种情况。这可以是一个名为pep8的文件夹,带有
\uuuu init\uuuuu.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'
这将告诉您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包存在的位置,那么这可能就是罪魁祸首

(进一步阅读:)

其他可能的解决办法 如果使用最新版本无法解决您的问题,您可以尝试使用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,必须首先激活环境。我用elpy following设置了我的Emacs。为了使它与conda一起工作,我还将flake等安装到根环境中

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

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