以下是验证期间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'
为什么我不能使用它?
答案 0 :(得分:0)
使用flake8
的最新版本,特别是flake8 >= 2.6.0
不再依赖pep8
模块(Source),可以解决此问题。你可以通过pip:
$ pip install flake8
应安装最新版本(目前为3.5.0)。
此错误告诉您flake8确实找到名为pep8
的模块,但该模块不包含名为normalize_paths
的函数。可能有多种原因,包括安装中断(应该修复重新安装片段和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,它将使用与您启动它的shell相同的环境。因此,为了从上面的环境中使用flake8,您必须首先激活环境。我在this tutorial之后使用elpy设置了我的Emacs。为了使它与conda一起工作,我还在根环境中安装了flake等。
如果以不同的方式启动Emacs(例如在Ubuntu上或从开始菜单使用M-F2),环境可能无法正常工作。我还没完全明白如何解决这个问题。