簡體   English   中英

Flake8屬性錯誤:“模塊”對象沒有屬性“ normalize_paths”

[英]Flake8 Attribute Error: 'module' object has no attribute 'normalize_paths'

這是驗證期間我的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'

我為什么不能使用它?

可以通過使用最新版本的flake8來解決此問題,特別是flake8 >= 2.6.0 ,該pep8不再依賴pep8模塊( Source )。 您可以通過pip安裝它:

$ pip install flake8

它將安裝最新版本(目前為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'

如您所見,此錯誤與您的錯誤有所不同,但類型相同。 這可能是由於pep8模塊中的微小更改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,必須首先激活該環境。 我按照本教程使用elpy設置了Emacs。 為了使它與conda一起工作,我還在根環境中安裝了flake等。

如果以其他方式啟動Emacs(例如,在Ubuntu上使用M-F2或從“開始”菜單啟動),則環境可能無法正常工作。 我還不完全了解如何解決該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM