9 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_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'
Run Code Online (Sandbox Code Playgroud)
为什么我不能使用它?
这个问题可以通过使用最新版本的 来解决flake8,特别flake8 >= 2.6.0是它不再依赖于该pep8模块(源代码)。您可以通过 pip 安装它来做到这一点:
$ pip install flake8
Run Code Online (Sandbox Code Playgroud)
应该安装最新版本(目前为 3.5.0)。
此错误告诉您 flake8 确实找到了名为 的模块pep8,但该模块不包含名为 的函数normalize_paths。造成这种情况的原因可能有多种,包括安装损坏(应该通过重新安装 flake 和 pep8 来修复)以及pep8路径中的冲突版本。当您修改您的sys.path和/或以某种方式设法将名为 pep8 的自己的模块放入您的路径时,可能会发生后者。这可以像__init__.py本示例中名为 pep8 的文件夹一样小:
$ 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'
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这个错误与您的错误略有不同,但属于同一类型。这可能是由于pep8模块中的微小变化造成的。
要查看一切是否顺利,您可以检查 python 路径的内容和模块的位置pep8。
$ python
>>> import pep8
>>> pep8.__file__
/home/me/miniconda3/envs/fl8/lib/python3.5/site-packages/pep8.py
Run Code Online (Sandbox Code Playgroud)
这会告诉您pep8Python 正在使用哪个模块。因此,这应该指向您的 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']
Run Code Online (Sandbox Code Playgroud)
这显示了 Pythonpep8在其中搜索模块的所有文件夹(从上到下)。因此,如果其中有一条路径确实指向您不希望有 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
Run Code Online (Sandbox Code Playgroud)
如果从命令行启动 Emacs,它会使用与启动它的 shell 相同的环境。因此,为了从环境中使用 flake8,如上所示,您必须首先激活环境。我按照本教程使用 elpy 设置了我的 Emacs 。为了使其与 conda 一起工作,我还在 root 环境中安装了 flake 等。
如果您以不同的方式启动 Emacs(例如在 Ubuntu 上使用 M-F2 或从开始菜单),环境可能无法正常工作。我还不完全明白如何解决这个问题。
| 归档时间: |
|
| 查看次数: |
680 次 |
| 最近记录: |