Jaki jest powód wystąpienia błędu AttributeError: ' module ' obiekt nie ma atrybutu ' check\_output ' w Pythonie?


Najlepsza odpowiedź

Bez zobaczenia kodu trudno jest znaleźć ostateczną odpowiedź, ale Myślę, że problem polega na tym, że importowany kod jest podobny do tego:

Masz moduł o nazwie fluff, a wewnątrz tego modułu masz klasę o nazwie fluff; w klasie fluff jest metoda o nazwie check\_output

Twój kod wygląda następująco:

import fluff

cfg = fluff.check\_output(stuff) # You want the fluff class here

Problem w tym, że wszystko, co import fluff importuje moduł puchu. Klasa puchu, której potrzebujesz, nazywa się w rzeczywistości fluff.fluff.

Istnieją dwa rozwiązania:

1:

import fluff

cfg = fluff.fluff.check\_output(stuff) # You want the fluff class here

2:

from fluff import fluff # this imports the fluff class.

cfg = fluff.check\_output(stuff) # You want the fluff class here

Jest to jeden z powodów, dla których konwencja nazewnictwa jest tak ważna – jeśli moduły a klasy są zgodne z konwencją nazewnictwa PEP8, w której kod wyglądałby

from fluff import Fluff # this imports the fluff class.

cfg = Fluff.check\_output(stuff) # You want the fluff class here

Duże „F” może wystarczyć, aby zapobiec błędom – lub przynajmniej wskazać potencjalne problemy

-——

Inną potencjalną odpowiedzią jest to, że Moduł, który importujesz, jest przesłaniany przez inny plik (innymi słowy, istnieje plik o tej samej nazwie, który Python znajduje wcześniej w poszukiwaniu tego, co ma zaimportować). Najczęstszą tego przyczyną u początkujących jest to, że nadasz skryptowi taką samą nazwę jak moduł, który próbujesz zaimportować; ponieważ Python ZAWSZE przeszukuje bieżący plik katalogu, jeśli masz skrypt o nazwie „foo.py” i wykonuje „import foo”, import ten zaimportuje skrypt o nazwie „foo.py” – prawdopodobnie nie to, czego chcesz.

Najlepszym sposobem na zdiagnozowanie tego problemu jest otwarcie konsoli interaktywnej w tym samym katalogu i wpisanie:

>>> import

>>> .\_\_file\_\_

gdzie to nazwa modułu, który próbujesz zaimportować. Wynik polecenia w linii 2 będzie ścieżką do pliku, który Python próbował zaimportować i możesz zobaczyć, czy to jest miejsce, w którym plik powinien być.

Odpowiedz

Bez szukania w twoim kodzie może to być jeden z dwóch problemów (ale nie ograniczających się do tych dwóch), które od razu przychodzą mi do głowy, a są to:

  1. Moduł nie jest poprawnie zainstalowany. Sprawdź, czy w folderze pakietów witryn znajduje się moduł. Jeśli tam jest, może to być problem, nie. 2, czyli:
  2. Nie działa z odpowiednią wersją Pythona, tj. Instaluje moduły przeznaczone dla Python2, ale wywołuje z importem Python3. Użyj pip, aby odinstalować moduł, a następnie spróbuj ponownie zainstalować za pomocą pip3, aby uzyskać odpowiednią wersję. Nie wiem dlaczego, ale niektóre maszyny, takie jak mój Raspberry Pi Zero W v1.1, domyślnie używają polecenia pip na Python2 zamiast 3. Ponowna instalacja za pomocą pip3 zadziałała, ponieważ używam kodu przy użyciu python3 zamiast zwykłego python.

Mogę zasugerować tymczasowe „brudne” rozwiązanie polegające na skopiowaniu źródła modułu do twojego katalog roboczy, tzn. pobranie folderu „module” i umieszczenie go w tym samym folderze, co uruchomiony plik źródłowy. Może się również zdarzyć, że sklonowałeś repozytorium git lub wyodrębniłeś z folderu .zip, w którym plik module.py znajduje się w innym folderze, który znajduje się w innym folderze o tej samej nazwie. W tym przypadku pomocne może być zaimportowanie module.module jako modułu zamiast prostego importowania modułu od razu, tak jak to:

import module.module as module

zamiast

import module

co zmniejsza ilość zmian w kodzie. Powodzenia!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *