Pracuję nad pakietem w Pythonie. Używam virtualenv. Ustawiłem ścieżkę do katalogu głównego modułu w ścieżce .pth w moim virtualenv, aby móc importować moduły pakietu podczas opracowywania kodu i testowania (Pytanie 1: czy to dobry sposób?). To działa dobrze (oto przykład, to jest zachowanie, które chcę):
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul 1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py
issued command: echo hello
command output: hello
Jeśli jednak spróbuję użyć PyTest, otrzymuję komunikaty o błędach importu:
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile:
collected 0 items / 1 errors
================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
from rc import ns
E ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest
Jestem trochę zdziwiony, wygląda na to, że oznacza to błąd importu, ale Python radzi sobie dobrze, więc dlaczego występuje problem konkretnie z PyTestem? Jakieś sugestie co do powodu / rozwiązania (pytanie 2)? Wyszukałem w Google i przepełniłem stos błędu „ImportError: nie można zaimportować” dla PyTest, ale trafienia, które otrzymałem, były związane z brakującą ścieżką do Pythona i rozwiązaniem tego problemu, co nie wydaje się być tutaj problemem. Jakieś sugestie?
Nie mogę powiedzieć, że rozumiem, dlaczego to działa, ale miałem ten sam problem i testy działają dobrze, jeśli uruchomię
python -m pytest
.Jestem w virtualenv, pytest jest również dostępny globalnie:
źródło
python -m pytest [...]
„doda również bieżący katalog dosys.path
”.python3 -m pytest
PYTHONPATH=.:./src pytest
jako celu make.Właśnie rozwiązałem ten problem, usuwając __init__.py w katalogu głównym mojego projektu:
źródło
__init__.py file in a folder containing TESTS
nie rozwiązała mojego problemu. Ten działał. Myślę, że to z powodu hierarchii plików.__init__.py
plik. Nadal miałem problem. Dodanie pliku conftest.py do katalogu głównego zadziałało.Miałem ten sam problem, ale z innego powodu niż wymienione:
Miałem py.test zainstalowany globalnie, podczas gdy pakiety były zainstalowane w środowisku wirtualnym.
Rozwiązaniem była instalacja
pytest
w środowisku wirtualnym. (W przypadku, gdy twoja powłoka haszuje pliki wykonywalne, tak jak robi to Bash, użyjhash -r
lub użyj pełnej ścieżki dopy.test
)źródło
pytest
w virtualenv stworzonym przezconda
, alepytest
jest dostępny w środowisku root anacondy. Dlatego można znaleźć pytest , ale nie można znaleźć żadnego pakietu zainstalowanego w środowisku.pip3 install pytest
Inside virtualenv naprawił problem.Ten problem wystąpi, jeśli masz
tests.py
plik i folder testów z rozszerzeniemtests/__init__.py
.Podczas zbierania pytest znajduje folder, ale gdy spróbuje zaimportować pliki testowe z folderu,
tests.py
plik spowoduje problem z importem.Aby naprawić, po prostu usuń
tests.py
plik i umieść wszystkie testy wtests/
folderze.W Twoim konkretnym przypadku poprawka będzie dokładnie taka:
/home/zz/Desktop/GitFolders/rc/tests.py
/home/zz/Desktop/GitFolders/rc/tests/__init__.py
jest obecnyźródło
Miałem podobny problem, dokładnie ten sam błąd, ale inną przyczynę. Uruchomiłem kod testowy dobrze, ale przeciwko starej wersji modułu. W poprzedniej wersji mojego kodu jedna klasa istniała, a druga nie. Po zaktualizowaniu kodu powinienem był wykonać poniższe czynności, aby go zainstalować.
sudo pip install ./ --upgrade
Po zainstalowaniu zaktualizowanego modułu uruchomienie pytest zwróciło poprawne wyniki (ponieważ używałem poprawnej podstawy kodu).
źródło
pip install ./ --upgrade
zaktualizowało zainstalowaną wersję biblioteki najnowszym kodem i włączyło pytest, aby również znaleźć tę najnowszą wersję.Zainstaluj pakiety w swoim wirtualnym środowisku.
Następnie uruchom nową powłokę i ponownie uruchom środowisko wirtualne.
źródło
W moim przypadku wystąpił błąd importu, ponieważ pakiet wskazuje na inny pakiet / katalog o tej samej nazwie, a jego ścieżka jest o jeden poziom wyżej niż folder, który faktycznie chciałem. Myślę, że to również wyjaśnia, dlaczego niektórzy ludzie muszą usunąć _ init _.py, a inni muszą dodać ponownie.
Po prostu wstawiłem
print(the_root_package.__path__)
(poimport the_root_package
) zarówno dopython
konsoli, jak ipytest
do skryptów, aby porównać różnicęLINIA DOLNA: Jeśli to zrobisz
python
, importowany pakiet może różnić się od pakietu po uruchomieniupytest
.źródło
Powyższa odpowiedź nie działa dla mnie. Właśnie go rozwiązałem, dołączając bezwzględną ścieżkę modułu, którego nie znaleziono,
sys.path
na górzetest_xxx.py
(twojego modułu testowego), na przykład:źródło
test_main.py
, umieściłem go wconftest.py
katalogu testowym i zadziałało. Dziękujemy za dostarczenie programowego rozwiązania zamiast zaśmiecania plików.Jeśli jest to związane z kodem Pythona, który został pierwotnie opracowany w Pythonie 2.7, a teraz został przeniesiony do Pythona 3.x, to prawdopodobnie problem jest związany z problemem z importem.
np. podczas importu obiektu z pliku:
base
który znajduje się w tym samym katalogu to zadziała w Pythonie 2.x:w pythonie 3.x powinieneś zamienić na
base
pełną ścieżkę lub.base
nie zrobienie tego spowoduje powyższy problem. więc spróbuj:źródło
Doświadczyłem dzisiaj tego problemu i rozwiązałem go, dzwoniąc
python -m pytest
z katalogu głównego mojego projektu.Dzwonienie
pytest
z tej samej lokalizacji nadal powodowało problemy.Mój projekt jest zorganizowany jako:
Moduł
routes
został zaimportowany w moimtest_routes.py
jako:from server.routes.routes import Routes
Mam nadzieję, że to pomoże!
źródło
Inny szczególny przypadek:
Miałem problem z używaniem toksyny. Więc mój program działał dobrze, ale testy przez toksykologię narzekały. Po zainstalowaniu pakietów (potrzebnych dla programu) należy dodatkowo określić pakiety używane w unittestach w tox.ini
źródło
Otrzymywałem to za pomocą VSCode. Mam środowisko Conda. Nie sądzę, aby rozszerzenie VScode w Pythonie mogło zobaczyć aktualizacje, które robiłem.
Musiałem biec
pip install ./ --upgrade
źródło
Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Edytuj swój conftest.py i dodaj następujące wiersze kodu:
A jeśli próbujesz uruchomić przypadek testowy przez terminal, użyj następującego przykładu:
źródło
NameError: name 'file' is not defined
- czemu plik powinien równać się?Kolejna ogromna wygrana dla systemu importu Pythona. Myślę, że powodem braku konsensusu jest to, że to, co działa, zależy prawdopodobnie od twojego środowiska i narzędzi, których używasz.
Używam tego z VS Code, w eksploratorze testów pod Windows w środowisku Conda, Python 3.8.
Konfiguracja, którą mam do pracy, to:
W tej konfiguracji funkcja Intellisense działa, podobnie jak test wykrywania.
Zauważ, że początkowo próbowałem następujących rozwiązań, zgodnie z zaleceniami tutaj .
Nie mogłem znaleźć sposobu, aby to zadziałało z VS Code, ponieważ
src
folder po prostu zepsuł umysł systemu importu. Mogę sobie wyobrazić, że jest sposób, aby to zadziałało z wiersza poleceń. Jako stosunkowo nowy konwerter na programowanie w Pythonie, daje mi to nostalgiczne uczucie pracy z COM, ale jest nieco mniej przyjemne.źródło
Moje 2 centy na tym: pytest nie powiedzie się przez przypadek, jeśli nie używasz środowisk wirtualnych. Czasami to po prostu zadziała, czasami nie.
Dlatego rozwiązaniem jest:
Kod przy użyciu programu Windows PowerShell:
I wreszcie
Przykład setup.py dla pip install -e:
źródło
Nie zgadzam się z postami mówiącymi, że musisz usunąć wszelkie
__init__.py
pliki. Zamiast tego musisz zmienić pliksys.path
.Przeprowadź eksperyment, w którym drukujesz
sys.path
podczas normalnego uruchamiania kodu. Następnie wydrukujsys.path
podczas uruchamiania kodu przez pytest. Myślę, że przekonasz się, że jest różnica między tymi dwiema ścieżkami, stąd dlaczego pytest przerywa.Aby to naprawić, wstaw ścieżkę z pierwszego eksperymentu do zerowego indeksu drugiego.
Niech
'/usr/exampleUser/Documents/foo'
będzie pierwszym elementemprint(sys.path)
eksperymentu 1.Poniżej znajduje się kod, który powinien rozwiązać Twój problem:
import sys sys.path[0] = '/usr/exampleUser/Documents/foo'
Umieść to na początku pliku, przed faktycznym oświadczeniem o imporcie.
Źródło: sam sobie z tym radziłem i powyższy proces rozwiązał.
źródło
Zachowałem wszystko tak samo i po prostu dodałem pusty plik testowy w folderze głównym. Rozwiązany
Oto ustalenia, ten problem naprawdę mnie trapił przez jakiś czas. Moja struktura folderów była
i pytest narzekałby na ModuleNotFoundError i dał WSKAZÓWKĘ - upewnij się, że testowe moduły / pakiety mają prawidłowe nazwy w Pythonie.
Wprowadziłem próbny plik testowy na tym samym poziomie co mathsapp i katalog testing. Plik nie zawierał nic. Teraz pytest nie narzeka.
Wynik bez pliku
Wyniki z plikiem
źródło
Rozwiązałem problem, ustawiając
PYTHONPATH
zmienne środowiskowe dla określonej konfiguracji, z którą przeprowadzam testy.Podczas przeglądania pliku testowego w PyCharm:
Ctrl
+Shift
+A
Edit Configurations
PYTHONPATH
obszarze Środowisko> Zmienne środowiskowe.źródło
Po prostu umieść pusty
conftest.py
plik w katalogu głównym projektu, ponieważ kiedypytest
odkryje conftest.py, modyfikuje sys.path, aby mógł importować rzeczy zconftest
modułu. Ogólna struktura katalogów może być:źródło
Miałem podobny problem i zadziałało, gdy dodałem
__init__.py
plik w katalogu testing.źródło
Może się zdarzyć, że Pytest nie czyta pakietu jako modułu Pythona, podczas gdy Python to (prawdopodobnie z powodu problemów ze ścieżką). Spróbuj zmienić katalog skryptu pytest lub jawnie dodaj moduł do pliku PYTHONPATH.
Lub może być tak, że masz dwie wersje Pythona zainstalowane na swoim komputerze. Sprawdź źródło języka Python pod kątem pytest i uruchomionej powłoki języka Python. Jeśli są różne (np. Python 2 vs 3), użyj,
source activate
aby upewnić się, że uruchamiasz pytest zainstalowany dla tego samego języka Python, w którym jest zainstalowany moduł.źródło
Dla każdego, kto próbował wszystkiego i nadal otrzymywał błędy, mam obejście.
W folderze, w którym jest zainstalowany pytest , przejdź do folderu pytest-env .
Otwórz plik pyvenv.cfg .
W pliku zmiana include-system-site-packages z false na true .
Mam nadzieję, że to zadziała. Nie zapomnij o głosowaniu.
źródło
Jeśli masz już pliki .pyc, spróbuj je usunąć.
Dziś napotykam ten problem, oto co się stało:
najpierw uruchamiam pytest w mac (to wygeneruje pliki pyc), potem uruchamiam kontener docker (system operacyjny jest alpine), z zamontowanym katalogiem projektu, a potem, gdy próbuję uruchomić pytest w kontenerze, pojawia się ImportError. po wyczyszczeniu wszystkich plików pyc nie ma już błędów.
Mam nadzieję, że to może być pomocne.
źródło
jeśli potrzebujesz pliku init .py w swoim folderze, wykonaj kopię folderu i usuń z niego plik init .py, aby uruchomić testy, działa on dla projektów lokalnych. Jeśli chcesz regularnie uruchamiać test, sprawdź, czy możesz przenieść swój init .py do oddzielnego pliku.
źródło
[Rozwiązane] Zanim przejdziemy bezpośrednio do rozwiązania usuwania / dodawania
__init__.py
, możemy również chcieć przyjrzeć się, jak import został wykonany w Twoich klasach. Właściwie straciłem dzień na zabawie__init__.py
myśląc, że to może być problem :) Jednak to było dość pouczające.W moim przypadku był to niewłaściwy sposób wywoływania klas z jednej klasy Pythona do innej, która była rzucana
ImportError
. Naprawiono sposób wywoływania klas / modułów i działało to jak urok. Mam nadzieję, że to pomoże również innym.I tak, dla podobnego błędu możemy mieć różne rozwiązania w zależności od tego, jak kod jest napisany. Lepiej poświęcić więcej czasu na samodzielne debugowanie. Wyciągnięta lekcja :) Miłego kodowania !!!
źródło
W moim przypadku pracuję w kontenerze i niestety pytest ma tendencję do używania pythona2.7 zamiast mojego wybranego interpretera python3.
W moim przypadku to zadziałało:
Moja struktura folderów
źródło
Umieściłem wszystkie moje testy w folderze testów i otrzymywałem ten sam błąd. Rozwiązałem to, dodając init .py w tym folderze w następujący sposób:
źródło