Nie można zaimportować modułu, który jest na pewno zainstalowany

144

Po zainstalowaniu mechanize nie mogę go zaimportować.

Próbowałem zainstalować z pip, easy_install i za pośrednictwem python setup.py installtego repozytorium: https://github.com/abielr/mechanize . Wszystko to bezskutecznie, ponieważ za każdym razem, gdy wchodzę na mój interaktywny Python, otrzymuję:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mechanize
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mechanize
>>> 

Instalacje, które uruchomiłem wcześniej, informowały, że zakończyły się pomyślnie, więc oczekuję, że import zadziała. Co może być przyczyną tego błędu?

Roy
źródło
Czy możesz pokazać nam wynik biegania easy_install? Ponadto proszę potwierdzić pełną ścieżkę easy_install, pipi od python.
larsks
Czy na pewno nie został zainstalowany w wersji 2.6 (co jest domyślne na Ubuntu? (Przynajmniej na moim debianie)
dav1d
cóż, wyjście z łatwej instalacji pokazuje, że jest zainstalowana w wersji 2.7: Zainstalowano /usr/local/lib/python2.7/dist-packages/mechanize-0.2.6.dev_20130112-py2.7.egg
roy
@larks - dodał te informacje w oryginalnym post
roy
Właśnie wypróbowałem to na wszystkie sposoby - setup.py, easy_install, pip - z pypi i repozytorium, ale nie mogę sprawić, żeby to się nie powiedzie. Czy możesz sprawdzić, sys.pathczy szukasz odpowiednich miejsc, ls -laR /usr/local/lib/python2.7/dist-packages/mech*sprawdzić problemy z uprawnieniami i imp.find_module("mechanize")rozróżnić błędy nie do znalezienia i nie do przetrwania podczas importowania?
DSM

Odpowiedzi:

100

W moim przypadku jest to problem z pozwoleniami. Pakiet został w jakiś sposób zainstalowany tylko z uprawnieniami roota rw, inny użytkownik po prostu nie może do niego rw!

Paul Wang
źródło
26
To mi się przytrafiło, po prostu biegałem sudo pip install .... Prosta poprawka:sudo chmod -R ugo+rX /lib/python2.7/site-packages/
jozxyqk
3
Napotkałem to wiele razy i myślę, że właśnie odkryłem powód: umask jest przekazywany przez sudo, więc jeśli twoja osobista umask jest ciasna i używasz sudo do instalacji, pliki i katalogi będą zbyt ograniczone. Jeśli najpierw wykonasz po prostu su, a następnie wykonasz instalację z pełnej powłoki roota, wynikowa instalacja będzie użyteczna (przynajmniej dla mnie). To było dla pip, ale może też dotyczyć apt-get. Jeśli inni potwierdzą tę przyczynę, czy zechcesz odpowiednio zmienić odpowiedź?
Brandyn
Dodawanie do komentarzy jozxyqk: upewnij się, że masz właściwy katalog, robiąc $ pip show <package_name>
Federico
2
Dla mnie to samo. Pracuję z Pythona 3.6 na Mac, więc sudo chmod 777 /usr/local/lib/python3.6/site-packageswystarczyły
Antonio Serrano
3
sudo 777 jest zawsze bardzo złym pomysłem
Marx
81

Miałem ten sam problem: skrypt z import coloramawyrzucał i ImportError, ale sudo pip install coloramamówił mi "pakiet już zainstalowany".

Mój dylemat: uruchomić pip bez sudo : pip install colorama. Następnie pip zgodził się, że należy go zainstalować, zainstalować i uruchomić mój skrypt.

Moje środowisko to Ubuntu 14.04 32-bitowe; Wydaje mi się, że widziałem to przed i po aktywowaniu virtualenv.

UPDATE : jeszcze lepiej, użyj python -m pip install <package>. Zaletą tego jest to, że ponieważ wykonujesz określoną wersję języka Python, w której chcesz umieścić pakiet, pip jednoznacznie zainstaluje pakiet we „właściwym” języku Python. Ponownie, nie używaj sudo w tym przypadku ... wtedy otrzymasz pakiet we właściwym miejscu, ale prawdopodobnie z (niechcianymi) uprawnieniami roota.

Dan H.
źródło
1
alternatywnie możesz użyć flagi -H sudo
Graydyn Young
21

To problem ze ścieżką w Pythonie.

W moim przypadku mam zainstalowanego Pythona w:

/Library/Frameworks/Python.framework/Versions/2.6/bin/python,

i nie ma katalogu pakietów witryn w pythonie2.6.

Pakiet (SOAPpy), który zainstalowałem przez pip, znajduje się

/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/

Pakiet witryn nie znajduje się w ścieżce Pythona, wszystko, co zrobiłem, to na stałe dodałem pakiety witryn do PYTHONPATH.

  1. Otwórz Terminal
  2. Wpisz open .bash_profile
  3. W wyskakującym pliku tekstowym dodaj ten wiersz na końcu:

    eksportuj PYTHONPATH = $ PYTHONPATH: /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/

  4. Zapisz plik, uruchom ponownie terminal i gotowe
user1552891
źródło
Pomogło mi to w przekonaniu Jenkinsa do pracy z pytonem selenowym.
edst
To zadziałało w przypadku mnie, gdy zarządzałem selerem przez przełożonego, kiedy mój skrypt bash nazwał mój skrypt selera; skrypt selera nie mógł zaimportować już zainstalowanych modułów w moim pip. Dzięki za tonę.
Shivam Sharma
Uwaga: inną możliwością wystąpienia błędu importu jest to, że na komputerze jest zainstalowanych wiele wersji języka Python. Na przykład jeden z systemu Python i jeden z Miniconda lub Anaconda. Dlatego zawsze upewnij się, że używasz odpowiedniego odpowiedniego „pip”.
Sanchit
8

Mechanizm importu Pythona naprawdę działa, więc albo:

  1. Twoja PYTHONPATH jest nieprawidłowa,
  2. Twoja biblioteka nie jest zainstalowana tam, gdzie myślisz
  3. Masz inną bibliotekę o tej samej nazwie, która maskuje tę
Ali Afshar
źródło
1
W tym przypadku nie może to być opcja 3; który nie zgłosiłby błędu ImportError.
Martijn Pieters
2
może 2? Po prostu nie wiem, dlaczego miałoby się zainstalować w niewłaściwym miejscu dla tej jednej biblioteki, gdzie większość innych jest w porządku.
Roy
3
Opcja 4: Twoja PYTHONPATH jest właściwa, Twoja biblioteka jest tam, gdzie chcesz, nie masz biblioteki maskującej to ... ale ponieważ użyłeś sudo pip installjej, została zainstalowana z uprawnieniami roota, a podczas importu coś bombarduje z powodu braku dostęp do odczytu lub zapisu.
Dan H
2
Nie do końca prawda, @MartijnPieters: jeśli nastąpił import formularza „z <package> import <foo>”, a blokujący pakiet nie miał „foo”, wtedy pojawiłby się błąd importu dla opcji 3.
Dan H
@DanH jasne, ale to nie jest forma, której używa OP.
Martijn Pieters
8

Uderzałem głową w monitor, dopóki młody stażysta nie powiedział mi, że sekretem jest „python setup.py install” w katalogu modułów.

Z jakiegoś powodu uruchomienie konfiguracji z tego miejsca sprawia, że ​​po prostu działa.

Dla jasności, jeśli nazwa twojego modułu to „foo”:

[burnc7 (2016-06-21 15:28:49) git]# ls -l
total 1
drwxr-xr-x 7 root root  118 Jun 21 15:22 foo
[burnc7 (2016-06-21 15:28:51) git]# cd foo
[burnc7 (2016-06-21 15:28:53) foo]# ls -l
total 2
drwxr-xr-x 2 root root   93 Jun 21 15:23 foo
-rw-r--r-- 1 root root  416 May 31 12:26 setup.py
[burnc7 (2016-06-21 15:28:54) foo]# python setup.py install
<--snip-->

Jeśli spróbujesz uruchomić plik setup.py z dowolnego innego katalogu, wywołując jego ścieżkę, zakończy się błędną instalacją.

NIE DZIAŁA:

python /root/foo/setup.py install

DZIAŁA:

cd /root/foo
python setup.py install
Locane
źródło
7

Udało mi się rozwiązać ten problem, stosując podejście łączone. Najpierw postąpiłem zgodnie z radą Chrisa, otworzyłem wiersz poleceń i wpisałem „pip show nazwa_pakietu”. Podało to lokalizację zainstalowanego pakietu.

Następnie otworzyłem Pythona i wpisałem „import sys”, a następnie „sys.path”, aby pokazać, gdzie mój Python szuka wszelkich importowanych przeze mnie pakietów. Niestety, lokalizacji pokazanej w pierwszym kroku NIE było na liście.

W ostatnim kroku wpisałem „sys.path.append („ package_location_seen_in_step_1 ”). Opcjonalnie możesz powtórzyć krok drugi, aby zobaczyć, że lokalizacja jest teraz na liście.

Krok testowy, spróbuj ponownie zaimportować pakiet ... to działa.

Wadą? Jest tymczasowy i za każdym razem trzeba go dodawać do listy.

MJ_
źródło
5

Napotkałem to podczas próby użycia zestawu kluczy, który zainstalowałem za pośrednictwem sudo pip install keyring. Jak wspomniano w innych odpowiedziach, w moim przypadku jest to problem z uprawnieniami.

Co mi pomogło:

  1. Odinstalowany brelok:
    • sudo pip uninstall keyring
  2. Użyłem -Hopcji sudo i ponownie zainstalowałem zestaw kluczy:
    • sudo -H pip install keyring

Mam nadzieję że to pomoże.

szuler
źródło
3

Jestem nowy w Pythonie. Rozwiązałem ten problem, zmieniając ścieżkę interpretera projektu.
File -> Settings -> Project -> Project Interpreter

Amit Dheemate
źródło
Skąd IDE lub ???
Christopher Kikoti
2

Nie mogłem sprawić, by moja PYTHONPATH działała poprawnie. Zdałem sobie sprawę, że dodanie exportrozwiązało problem:

(zadziałało)

export PYTHONPATH=$PYTHONPATH:~/test/site-packages

vs.

(nie działał)

PYTHONPATH=$PYTHONPATH:~/test/site-packages
George Weber
źródło
2

W moim przypadku biegałem pip install Django==1.11i nie chciałem importować z pythontłumacza.

Przeglądając polecenia pip, znalazłem, pip showktóre wyglądały tak:

> pip show Django
Name: Django
Version: 1.11
...
Location: /usr/lib/python3.4/site-packages
...

Zwróć uwagę, że lokalizacja mówi „3.4”. Okazało się, że polecenie python-command zostało połączone zpython2.7

/usr/bin> ls -l python
lrwxrwxrwx 1 root root 9 Mar 14 15:48 python -> python2.7

Zaraz obok znalazłem link o nazwie, python3więc z niego skorzystałem. Możesz także zmienić link na python3.4. To też by to rozwiązało.

Chris
źródło
1

W moim przypadku był to problem z brakującym plikiem init .py w module, który chciałem zaimportować w środowisku Python 2.7.

Python 3.3+ ma niejawne pakiety przestrzeni nazw, które pozwalają mu tworzyć pakiety bez pliku init .py.

jens_laufer
źródło
1

Jeśli inne wymienione odpowiedzi nie działają, spróbuj usunąć pamięć podręczną pip i ponownie zainstalować pakiet. Na moim komputerze działa Ubuntu14.04 i znajdował się pod ~/.cache/pip. Usunięcie tego folderu załatwiło sprawę.

Scrotch
źródło
1

Upewnij się również, że nie pomylisz się pip3z pip. Odkryłem, że pakiet, z którym pipzostał zainstalowany, nie działał python3i na odwrót.

Devansh Maurya
źródło
0

Czy w przypadku instalacji za pośrednictwem easy_installlub pipczy zakończy się pomyślnie? Jaka jest pełna wydajność? Z której instalacji Pythona korzystasz? Może być konieczne użycie polecenia sudoprzed instalacją, jeśli instalujesz moduły w katalogu systemowym (być może, jeśli używasz systemowej instalacji Pythona). W Twoim pytaniu nie ma zbyt wielu przydatnych informacji, ale niektóre narzędzia, które prawdopodobnie pomogą, obejmują:

  • echo $PYTHONPATHi / lub echo $PATH: podczas importowania modułów Python przeszukuje jedną z tych zmiennych środowiskowych (listy katalogów, :rozdzielane) w poszukiwaniu żądanego modułu. Problemy z importowaniem często wynikają z braku odpowiedniego katalogu na tych listach

  • which python, which piplub which easy_install: te wskażą lokalizację każdego pliku wykonywalnego. Warto wiedzieć.

  • Użyj virtualenv , jak sugeruje @JesseBriggs. Działa bardzo dobrze, pippomagając ci izolować i zarządzać modułami i środowiskiem dla oddzielnych projektów Pythona.

Ryan Artecona
źródło
0

Miałem dokładnie ten problem, ale żadna z powyższych odpowiedzi nie działała. Doprowadzało mnie to do szału, dopóki nie zauważyłem, że sys.path jest inny po zaimportowaniu z projektu nadrzędnego. Okazało się, że użyłem importlib do napisania małej funkcji, aby zaimportować plik spoza hierarchii projektu. Zły pomysł: zapomniałem, że to zrobiłem. Co gorsza, proces importu zepsuł się w sys.path - i tak to zostawił. Bardzo zły pomysł.

Rozwiązaniem było to zatrzymać i po prostu umieścić plik, który potrzebowałem zaimportować do projektu. Innym podejściem byłoby umieszczenie pliku we własnym projekcie, ponieważ od czasu do czasu trzeba go przebudowywać, a odbudowa może, ale nie musi, pokrywać się z przebudową głównego projektu.

Ivanlan
źródło
0

Miałem ten problem z zainstalowanymi wersjami 2.7 i 3.5 w moim systemie, próbując przetestować bota telegramu za pomocą Python-Telegram-Bot .

Nie mogłem go uruchomić po zainstalowaniu z pip i pip3, z sudo lub bez. Zawsze miałem:

Traceback (most recent call last):
  File "telegram.py", line 2, in <module>
    from telegram.ext import Updater
  File "$USER/telegram.py", line 2, in <module>
    from telegram.ext import Updater
ImportError: No module named 'telegram.ext'; 'telegram' is not a package

Prawidłowe przeczytanie komunikatu o błędzie informuje mnie, że Python szuka w bieżącym katalogu pliku telegram.py. I tak, miałem skrypt o nazwie telegram.py, który został załadowany przez Pythona, kiedy zadzwoniłem import.

Podsumowując, upewnij się, że nie masz żadnego package.pyw swoim bieżącym katalogu roboczym podczas próby importu. (I dokładnie przeczytaj komunikat o błędzie).

Patrick B.
źródło
0

Miałem podobny problem (w systemie Windows), a główną przyczyną w moim przypadku było oprogramowanie ANTYWIRUSOWE ! Posiada funkcję "Auto-Containment", która otacza uruchomiony proces jakimś rodzajem maszyny wirtualnej. Objawy to: pip install somemoduledziała dobrze w jednym oknie wiersza polecenia i import somemodulekończy się niepowodzeniem, gdy jest wykonywany z innego procesu z błędem

ModuleNotFoundError: No module named 'somemodule'

Mam nadzieję, że komuś zaoszczędzi to trochę czasu :)

Dima G.
źródło
0

Może trochę nie na temat, ale miałem problemy import PyYAML. Zwraca uwagę, że musisz import yaml. (myślę, że to klasyczny rtfm ...)

huch
źródło
0

Miałem podobny problem używając Django. W moim przypadku mógłbym zaimportować moduł z powłoki Django, ale nie z pliku .py, który zaimportował moduł.
Problem polegał na tym, że uruchamiałem serwer Django (a zatem wykonałem plik .py) z innego virtualenv, z którego został zainstalowany moduł.

Zamiast tego instancja powłoki była uruchamiana w poprawnym virtualenv. Stąd, dlaczego to zadziałało.

aleclara95
źródło
0

To działa!!!

Dzieje się tak często, gdy moduł jest instalowany w starszej wersji Pythona lub w innym katalogu, nie martw się, ponieważ rozwiązanie jest proste. - importuj moduł z katalogu, w którym moduł jest zainstalowany. Możesz to zrobić, najpierw importując sysmoduł Pythona , a następnie importując ze ścieżki, w której moduł jest zainstalowany

import sys
sys.path.append("directory in which module is installed")

import <module_name>
Terrence_Freeman
źródło
0

Większość możliwych przypadków została już uwzględniona w rozwiązaniach, po prostu udostępniając mój przypadek, zdarzyło mi się, że zainstalowałem pakiet w jednym środowisku (np. X) I importowałem pakiet w innym środowisku (np Y.). Dlatego zawsze upewnij się, że importujesz pakiet ze środowiska, w którym został zainstalowany.

Pedram
źródło
0

Coś, co zadziałało dla mnie, to:

python -m pip install -user {package name}

Polecenie nie wymaga sudo. Zostało to przetestowane na OSX Mojave.

IShaan
źródło
0

W moim przypadku musiałem również zainstalować moduł (y) dla superużytkownika.

sudo su
pip install <module>

Najwyraźniej superużytkownik nie może uzyskać dostępu do plików zwykłych użytkowników w pewnych okolicznościach.

Zciurus-Alt-Del
źródło
0

Dla mnie było to zapewnienie, że wersja modułu jest zgodna z wersją Pythona, z którego korzystałem .. Zbudowałem obraz na pudełku z Pythonem 3.6, a następnie wstrzyknąłem do obrazu Dockera, który miał zainstalowany 3.7 , a następnie uderzyłem się w głowę kiedy Python mówił mi, że moduł nie został zainstalowany ...

36m dla Pythona 3.6 bsonnumpy.cpython-36m-x86_64-linux-gnu.so

37m dla Pythona 3.7 bsonnumpy.cpython-37m-x86_64-linux-gnu.so

Streetster
źródło
pip installwersja, która pasuje do używanej wersji Pythona. Jaki błąd otrzymujesz i jaki jest wynikpython --version
streetster
python --version daje mi: Python 3.7.7 i kiedy sprawdzam, gdzie pakiet jest zainstalowany za pomocą pip, pokaż librosa; Lokalizacja: /home/ec2-user/anaconda3/lib/python3.7/site-packages jak oznacza, że ​​pakiet jest we właściwym miejscu, ale kiedy importuję pakiet daje: brak nazwy modułu pracuję na środowisku AWS Sagemaker Pytorch_p36
Walid Bousseta
prawdopodobnie chcesz używać pytorch_p37?
Streetster
nie ma pytorch_p37
Walid Bousseta
0

Wiem, że to bardzo stary post, ale dla mnie miałem problem z zainstalowanym 32-bitowym Pythonem i 64-bitowym Pythonem. Po odinstalowaniu 32-bitowego Pythona wszystko działało tak, jak powinno.

Moultrie
źródło
0

Rozwiązałem problem, że te same biblioteki działały dobrze w jednym projekcie (A), ale importowanie tych samych bibliotek do innego projektu (B) powodowało błąd. Używam Pycharm jako IDE w systemie operacyjnym Windows. Tak więc, po wypróbowaniu wielu potencjalnych rozwiązań i niepowodzeniu w rozwiązaniu problemu, zrobiłem dwie rzeczy (usunąłem folder „Venv” i ponownie skonfigurowałem interpreter):

Projekt 1-In (B), był folder o nazwie ("venv"), znajdujący się w Bibliotekach zewnętrznych /. Usunąłem ten folder.

2-Krok 1 (usunięcie folderu „venv”) powoduje błąd w konfiguracji interpretera języka Python, a na górze ekranu pojawia się komunikat „Nieprawidłowy interpreter języka Python wybrany dla projektu” i „skonfiguruj interpreter języka Python”, wybierz to łącze i gotowe otwiera nowe okno. Na liście rozwijanej „Interpreter projektu” znajduje się czerwona linia pokazująca poprzedniego nieprawidłowego tłumacza. Teraz otwórz tę listę i wybierz Python Interpreter (w moim przypadku jest to Python 3.7). Naciśnij „Zastosuj” i „OK” na dole i gotowe.

Uwaga: potencjalnie był to problem polegający na tym, że środowisko wirtualne mojego projektu (B) nie rozpoznawało już zainstalowanych i działających bibliotek.

Hasnain Haider
źródło
0

Jeśli używasz środowiska wirtualnego, użyj pipenv install <module name>zamiastpip install <module name>

Pracował dla mnie.

Manu
źródło
nie znaleziono pipenva
Walid Bousseta
0

Miałem też ten problem ... pakiet został zainstalowany w Pythonie 3.8.0, ale VS Code uruchamiał mój skrypt przy użyciu starszej wersji (3.4)

popraw w terminalu:

py .py

Upewnij się, że instalujesz pakiet w odpowiedniej wersji języka Python

Aramich100
źródło
0

Oto co mi pomogło, tak jak zrobił to dzisiaj znajomy (używam systemu Windows):

Naciśnij „Ustawienia” -> „Projekt” -> „Interpreter projektu”. Tutaj, w oknie po prawej stronie, znajduje się wiersz z tytułem „Tłumacz projektu” po lewej stronie. Kliknij tę linię, a otworzy się kilka dodatkowych linii.

Teraz naciśnij wiersz „Pokaż wszystko”. Otworzy się okno. W tym oknie naciśnij mały znak „+” w prawym górnym rogu.

Otworzy się nowe okno. Po lewej stronie znajdują się 4 zakładki, naciśnij najbardziej górną, która mówi „Środowisko Virtualenv”. Teraz w oknie po prawej zaznacz opcję „Istniejące środowisko”. Linia „Tłumacz” stanie się dobrze widoczna. Naciśnij przycisk „...” po prawej stronie wiersza.

Teraz otworzy się okno przeglądania. Przejdź do katalogu, w którym zainstalowałeś sam Python . Nie ten z PyCharm. Kiedy tam dotrzesz, wybierz plik „python.exe” i naciśnij OK (okno zniknie).

Naciśnij ponownie OK (to okno również zniknie).

Teraz w tym oknie upewnij się, że nowo utworzona linia jest zaznaczona i ponownie naciśnij OK.

Teraz wszystkie zainstalowane pakiety powinny być widoczne w interpretatorze projektu i są odczytywane przez Twój program.

rzymski
źródło
0

Najprostsze rozwiązanie, które zadziałało dla mnie, a którego nie widzę w tym wątku:

Mam zainstalowanych wiele wersji Pythona, ale próbowałem użyć Python3.7 - więc musiałem użyć:

sudo pip3.7 install <package>

J. Saw
źródło