这个问题可以通过使用最新版本的flake8
来解决,特别是flake8 >= 2.6.0
,它不再依赖于pep8
模块(来源)。您可以通过使用pip安装来实现:
$ pip install flake8
这应该安装最新版本(目前为3.5.0)。
出了什么问题?
这个错误告诉你flake8找不到一个名为pep8
的模块,但是该模块不包含一个名为normalize_paths
的函数。可能有多种原因,包括损坏的安装(应通过重新安装flake和pep8来修复),以及路径中存在冲突版本的pep8
。后者可能会在您修改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讨论)
其他可能的解决方案
如果使用最新版本不能解决您的问题,您可以尝试使用conda创建虚拟环境,在其中安装flake8
及其所有依赖项,以避免与Python安装的其他部分发生交互。在下载conda后,创建一个新环境(我的名称为fl8),激活它,安装flake8并使用它:
$ conda create -n fl8 python=2.7
$ source activate fl8
(fl8) $ pip install flake8
[...]
$ flake8 foo.py
关于Emacs
如果你从命令行启动Emacs,它将使用与你启动它的shell相同的环境。因此,为了使用像上面那样的环境中的flake8,你必须先激活该环境。我按照这个教程设置了我的Emacs,并安装了flake等到根环境中,以便能够在conda中使用。
如果你以不同的方式启动Emacs(例如在Ubuntu上使用M-F2或从开始菜单中启动),则该环境可能无法正常工作。我还没有完全理解如何解决这个问题。