pytest는 파이썬이 할 수있는 동안 모듈을 가져올 수 없습니다.


115

저는 파이썬으로 패키지 작업을하고 있습니다. 나는 virtualenv를 사용합니다. 내 virtualenv의 .pth 경로에있는 모듈의 루트 경로를 설정하여 코드를 개발하는 동안 패키지의 모듈을 가져오고 테스트를 수행 할 수 있습니다 (질문 1 :하는 것이 좋은 방법입니까?). 이것은 잘 작동합니다 (여기에 예제가 있습니다, 이것이 내가 원하는 동작입니다).

(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

그러나 PyTest를 사용하려고하면 몇 가지 가져 오기 오류 메시지가 표시됩니다.

(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

나는 약간 의아해합니다. 이것은 가져 오기 오류를 나타내는 것처럼 보이지만 Python은 정상적으로 작동하므로 PyTest에 특별히 문제가있는 이유는 무엇입니까? 이유 / 해결 방법에 대한 제안이 있습니까 (질문 2)? 나는 PyTest에 대한 'ImportError : cannot import'오류를 검색하고 스택 오버플로했지만 내가 얻은 히트는 파이썬 경로 누락과 관련이 있으며 여기에서 문제가되지 않는 것 같습니다. 어떤 제안?

답변:


118

답을 찾았습니다.

__init__.pypytest를 사용할 계획이라면 TESTS가 포함 된 폴더에 파일을 넣지 마십시오 . 그런 파일이 하나 있는데 삭제하면 문제가 해결되었습니다.

이것은 실제로 pytest 'ImportError : No module named YadaYadaYada'와 함께 PATH 문제 의 두 번째 답변에 대한 주석에 묻혔 으므로 여기에서 더 많은 가시성을 얻길 바랍니다.


44
이상한. 나는 같은 문제가 있었고 테스트 폴더에 init .py를 추가해야했습니다 .
Ev.

5
예, 이것은 (귀하의 경우에도 불구하고) 일반적인 해결책이 아닙니다. 왜 읽어야하는지 이해합니다 : docs.pytest.org/en/latest/goodpractices.html#test-package-name
juan

1
이 정보는 잘못되었으며 오해의 소지가 있습니다! init .py를 테스트 폴더에 추가 한 후 모든 것이 잘 작동했습니다
Leonardo Ostan

1
@LeonardoOstan 그것은 당신에게 잘못되었을 수 있지만이 정보가 일반적으로 잘못되었음을 의미하지는 않습니다. 제 경우에는 문제가 해결되었습니다.
Desprit

80

이것이 작동하는 이유를 이해한다고 말할 수는 없지만 동일한 문제가 있었고 실행하면 테스트가 잘 작동합니다 python -m pytest.

나는 pytest를 전 세계적으로 사용할 수있는 virtualenv에 있습니다.

(proj)tom@neon ~/dev/proj$ type -a python
python is /home/tom/.virtualenvs/proj/bin/python
python is /usr/bin/python

(proj)tom@neon ~/dev/proj$ python -V
Python 3.5.2

(proj)tom@neon ~/dev/proj$ type -a pytest
pytest is /home/tom/.virtualenvs/proj/bin/pytest
pytest is /usr/bin/pytest

(proj)tom@neon ~/dev/proj$ pytest --version
This is pytest version 3.5.0, imported from /home/tom/.virtualenvs/proj/lib/python3.5/site-packages/pytest.py

1
또한 나를 위해 일했습니다 .v.env 대신 정의 된 파이썬 버전에 의해 실행됩니다.
Nebulosar

12
한 가지 이유는 python -m pytest [...]"현재 디렉토리도에 추가합니다 sys.path."
minusf

윈도우 10에서 동일했다, 실행 파이썬 -m pytest는 해결
두초

이것은 내가 실행 python3 -m pytest
해야하는

@minusf의 의견을 기반으로 PYTHONPATH=.:./src pytestmake target으로 사용 하고 있습니다.
jan groth

29

내 프로젝트 루트에서 __init__.py를 제거하여이 문제를 해결했습니다.

.
├── __init__.py <--- removed
├── models
   ├── __init__.py
   ├── address.py
   ├── appointment.py
   └── client.py
├── requirements.txt
├── setup.cfg
├── tests
   ├── __init__.py
   ├── models
      ├── __init__.py
      ├── appointment_test.py
      └── client_test.py
   └── other_test.py
└── script.py

4
받아 들여진 대답 __init__.py file in a folder containing TESTS은 내 문제를 해결하지 못했습니다. 이것은 작동했습니다. 파일 계층 구조 때문인 것 같습니다.
smido

__init__.py파일 을 제거했습니다 . 나는 여전히 문제에 직면하고 있었다. conftest.py 파일을 루트 디렉토리에 추가하면 저에게 효과적이었습니다.
Vijay Sali

conftest.py가 루트가 아닌 / tests에있을 것으로 예상합니다
Aaron McMillin

conftest.py 파일을 루트 디렉토리로 가져 오면 문제가 해결되었습니다. tests 디렉토리에 init .py 파일 이 없습니다
업데이트

2
이 솔루션은 저에게 효과적이지만 누구든지 이것이 가져 오기 오류를 일으킬 것이라는 것을 알고 있습니까?
Aldo Okware

19

나는 같은 문제가 있었지만 언급 한 것 이외의 다른 이유로 :

패키지는 가상 환경에 설치되는 동안 전 세계적으로 py.test를 설치했습니다.

해결책은 pytest가상 환경 에 설치 하는 것이 었습니다 . (셸이 실행 파일을 해시하는 경우 Bash처럼를 사용 hash -r하거나에 대한 전체 경로를 사용 py.test)


2
아나콘다를 사용하여 동일한 교활한 문제가 있음을 깨달았습니다. pytest에서 만든 virtualenv 를 추가 하는 것을 잊었 conda지만 pytest아나콘다의 루트 환경에서 사용할 수 있습니다. 따라서 pytest 찾을 있지만 환경에 설치된 패키지는 찾을 없습니다.
Overdrivr

1
나는 같은 문제가 있었다. pytest는 virtualenv가 아니라 전역 적으로 설치되었습니다. pip3 install pytestvirtualenv 내부에서 문제가 해결되었습니다.
Ankit Singh

7

이 문제는 tests.py파일과 tests/__init__.py.

수집하는 동안 pytest는 폴더를 찾지 만 폴더에서 테스트 파일을 가져 오려고하면 tests.py파일로 인해 가져 오기 문제가 발생합니다.

수정하려면 tests.py파일을 제거하고 모든 테스트를 tests/폴더 안에 넣으십시오 .

특정 경우에 대한 수정 사항은 다음과 같습니다.

  • 파일 제거 /home/zz/Desktop/GitFolders/rc/tests.py
  • 만들기는 확실히 /home/zz/Desktop/GitFolders/rc/tests/__init__.py존재

4

나는 비슷한 문제, 똑같은 오류가 있었지만 다른 원인이 있습니다. 테스트 코드를 잘 실행했지만 이전 버전의 모듈에 대해 실행했습니다. 내 코드의 이전 버전에서는 하나의 클래스가 존재했지만 다른 클래스는 존재하지 않았습니다. 코드를 업데이트 한 후 다음을 실행하여 설치해야합니다.

sudo pip install ./ --upgrade

pytest를 실행하는 업데이트 된 모듈을 설치하면 올바른 결과가 생성되었습니다 (올바른 코드베이스를 사용했기 때문입니다).


1
이것은 나를 위해 일했습니다! 내 모듈은 동시에 pytest를 실행하는 데 사용했던 도커 컨테이너의 라이브러리로 설치되었습니다. 파이썬 인터프리터를 실행할 때 업데이트 된 코드를 찾을 수 있지만 pytest는 라이브러리가 처음 설치되었을 때와 마찬가지로 코드를 계속 찾습니다. 실행 pip install ./ --upgrade하면 설치된 lib 버전이 최신 코드로 업데이트되고 pytest도이 최신 버전을 찾을 수 있습니다.
FaustoW

4

제 경우에는 패키지가 동일한 이름을 가진 다른 패키지 / 디렉토리를 가리키고 경로가 실제로 원하는 폴더보다 한 수준 위에 있기 때문에 가져 오기 오류가 발생했습니다 . 나는 이것이 왜 어떤 사람들은 _ init _.py 를 제거 하고 다른 사람들은 다시 추가 해야하는 이유를 설명한다고 생각합니다 .

차이점 을 비교하기 위해 콘솔과 스크립트 모두 에 print(the_root_package.__path__)(뒤에 import the_root_package) 넣었습니다.pythonpytest

BOTTOM LINE : 이렇게하면 python가져 오는 패키지가를 실행할 때 패키지와 다를 수 있습니다 pytest.


3

가상 환경에 패키지를 설치하십시오.
그런 다음 새 셸을 시작하고 가상 환경을 다시 소싱합니다.


1
그게 내 문제였습니다. venv를 다시로드하지 않고 새로 설치하는 것
dec

2

위의 대답은 저에게 효과가 없습니다. 다음 sys.path과 같이 test_xxx.py(테스트 모듈) 맨 위에 찾을 수없는 모듈의 절대 경로를 추가하여 해결했습니다 .

import sys
sys.path.append('path')

1
이 줄을 내 .NET의 맨 위에 두는 대신 테스트 디렉토리에 test_main.py넣으면 conftest.py작동했습니다. 파일 쓰레기 대신 프로그래밍 솔루션을 제공해 주셔서 감사합니다.
Cameron Hudson

2

원래 python 2.7에서 개발되어 이제 python 3.x로 마이그레이션 된 python 코드와 관련된 경우 문제는 가져 오기 문제와 관련이있을 수 있습니다.

예를 들어 파일에서 객체를 가져올 때 : base동일한 디렉토리에 있는 파일 은 python 2.x에서 작동합니다.

from base import MyClass

파이썬 3.x에서는 base전체 경로로 교체해야 합니다. 그렇지 .base 않으면 위의 문제가 발생합니다. 그래서 시도하십시오 :

from .base import MyClass

2

오늘이 문제가 발생했으며 python -m pytest프로젝트 디렉터리의 루트에서 호출 하여 문제를 해결했습니다 .

pytest같은 위치에서 전화 를 걸면 여전히 문제가 발생했습니다.

내 프로젝트 디렉토리는 다음과 같이 구성됩니다.

api/
 - server/
  - tests/
      - test_routes.py
  - routes/
      - routes.py
 - app.py

모듈을 다음 routes으로 가져 왔습니다 test_routes.py.from server.routes.routes import Routes

도움이 되었기를 바랍니다.


알림을 보내 주셔서 감사합니다. 나는 과거에 트릭을 사용해야했으며 pytest 문서에 있습니다.
Jason R Stevens CFA

1

또 다른 특별한 경우 :

독극물을 사용하는 데 문제가있었습니다. 그래서 내 프로그램은 잘 실행되었지만 tox를 통한 단위 테스트는 계속 불평했습니다. 패키지를 설치 한 후 (프로그램에 필요함) tox.ini의 unittest에 사용되는 패키지를 추가로 지정해야합니다.

[testenv]
deps =
    package1
    package2 
...

1

VSCode를 사용하여 이것을 얻었습니다. 콘다 환경이 있습니다. VScode python 확장이 내가 만든 업데이트를 볼 수 있다고 생각하지 않습니다.

python c:\Users\brig\.vscode\extensions\ms-python.python-2019.9.34911\pythonFiles\testing_tools\run_adapter.py discover pytest -- -s --cache-clear test
Test Discovery failed:

나는 달려야했다 pip install ./ --upgrade


해당 pip 명령은 오류를 반환합니다.Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Derek

1

conftest.py를 편집하고 다음 코드 줄을 추가하십시오.

import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(file), '..')))

그리고 터미널을 통해 테스트 케이스를 실행하려는 경우 다음 예를 사용하십시오.

python -m pytest test_some_step_file_steps.py --html=HTML_step_file_output.html --self-contained-html

NameError: name 'file' is not defined-파일은 무엇과 같아야합니까?
Koshmaar

1

Python의 가져 오기 시스템에 대한 또 다른 큰 승리. 합의가없는 이유는 작동하는 것이 아마도 환경과 그 위에 사용하는 도구에 달려 있기 때문이라고 생각합니다.

conda 환경의 Windows 테스트 탐색기 인 Python 3.8에서 VS Code에서 이것을 사용하고 있습니다.

내가 일해야 할 설정은 다음과 같습니다.

mypkg/
    __init__.py
    app.py
    view.py
tests/
    test_app.py
    test_view.py

이 설정에서 intellisense가 작동하고 테스트 검색도 작동합니다.

여기 에서 권장하는대로 원래 다음을 시도했습니다 .

src/
    mypkg/
        __init__.py
        app.py
        view.py
tests/
    test_app.py
    test_view.py

src폴더가 가져 오기 시스템의 마음을 날려 버렸기 때문에 VS Code에서이 작업을 수행 할 방법을 찾을 수 없습니다 . 명령 줄에서이 작업을 수행하는 방법이 있다고 상상할 수 있습니다. Python 프로그래밍에 대한 비교적 새로운 변환으로서 COM 작업에 대한 향수를 불러 일으키지 만 약간 덜 재미 있습니다.


1

내 2 센트 : 가상 환경을 사용하지 않으면 pytest가 우연히 실패 할 것입니다. 때로는 작동하지 않을 때도 있습니다.

따라서 해결책은 다음과 같습니다.

  • pip 제거로 pytest 제거
  • Venv 만들기
  • Venv 활성화
  • pip는 프로젝트 경로를 편집 가능한 모드로 설치하므로 pytest에서 모듈로 처리합니다 (그렇지 않으면 pytest가 내부 가져 오기를 찾지 못함). 이를 위해서는 setup.py 파일이 필요합니다.
  • pytest를 포함한 패키지 설치
  • 마지막으로 테스트를 실행하십시오.

Windows PowerShell을 사용하는 코드 :

pip uninstall pytest
python.exe -m venv my_env
.\my_env\Scripts\activate
(my_env) pip install -e .
(my_env) pip install pytest pytest-html pandas numpy

그리고 마침내

(my_env) pytest --html="my_testing_report.html"

pip install -e에 대한 setup.py의 예 :

import setuptools

setuptools.setup(
    name='my_package',
    version='devel',
    author='erickfis',
    author_email='erickfis@gmail.com',
    description='My package',
    long_description='My gooood package',
    packages=setuptools.find_packages(),
    classifiers=[
        'Programming Language :: Python :: 3',
        'Operating System :: OS Independent',
    ],
    include_package_data=True
)

1

모든 __init__.py파일을 제거해야한다는 게시물에 동의하지 않습니다 . 대신해야 할 일은 sys.path.

sys.path코드를 정상적으로 실행할 때 인쇄하는 실험을 실행하십시오 . 그런 다음 sys.pathpytest를 통해 코드를 실행하면서 인쇄 하십시오. 이 두 경로 사이에 차이가 있다는 것을 알게 될 것이므로 pytest가 중단되는 이유는 무엇입니까?

이를 수정하려면 첫 번째 실험의 경로를 두 번째 색인의 0 번째 색인에 삽입합니다.

하자 '/usr/exampleUser/Documents/foo'의 첫 번째 요소가 될 print(sys.path)실험 1.

다음은 문제를 해결해야하는 코드입니다.

import sys sys.path[0] = '/usr/exampleUser/Documents/foo'

실제 수입 명세서 앞에 이것을 파일 상단에 넣으십시오.

출처 :이 문제를 직접 다루었 고 위의 과정을 통해 해결되었습니다.


1

모든 것을 동일하게 유지하고 방금 루트 폴더에 빈 테스트 파일을 추가했습니다 .. 해결

여기에 발견이 있습니다.이 문제는 한동안 저를 괴롭 혔습니다. 내 폴더 구조는

mathapp/
    - server.py  
    - configuration.py 
    - __init__.py 
    - static/ 
       - home.html  
tests/            
    - functional 
       - test_errors.py 
    - unit  
       - test_add.py

그리고 pytest는 ModuleNotFoundError로 불평하고 힌트를 제공합니다-테스트 모듈 / 패키지에 유효한 Python 이름이 있는지 확인하십시오.

나는 mathsapp 및 tests 디렉토리와 동일한 수준의 모의 테스트 파일을 도입했습니다. 파일에는 아무것도 포함되어 있지 않습니다. 이제 pytest는 불평하지 않습니다.

파일이없는 결과

$ pytest
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\mak2006\workspace\0github\python-rest-app-cont
collected 1 item / 1 error

=================================== ERRORS ====================================
_______________ ERROR collecting tests/functional/test_func.py ________________
ImportError while importing test module 'C:\mainak\workspace\0github\python-rest-app-cont\tests\functional\test_func.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests\functional\test_func.py:4: in <module>
    from mathapp.service import sum
E   ModuleNotFoundError: No module named 'mathapp'
=========================== short test summary info ===========================
ERROR tests/functional/test_func.py
!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
============================== 1 error in 0.24s ===============================

파일 결과

$ pytest
============================= test session starts =============================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\mak2006\workspace\0github\python-rest-app-cont
collected 2 items

tests\functional\test_func.py .                                          [ 50%]
tests\unit\test_unit.py .                                                [100%]

============================== 2 passed in 0.11s ==============================

이것은이 문제로 오랫동안 나를 위해 일했습니다. pytest가 첫 번째 테스트 파일을 찾을 때마다 프로젝트 루트를 처리하는 것처럼 보입니다. 확실히 이것은 버그입니까?
oooyaya

1

PYTHONPATH테스트를 실행하는 특정 구성에 대한 환경 변수를 설정하여 문제를 해결 했습니다.

PyCharm에서 테스트 파일을 보는 동안 :

  1. Ctrl+ Shift+A
  2. 유형 Edit Configurations
  3. PYTHONPATH환경> 환경 변수에서 설정하십시오 .

1

conftest.py를 발견하면 모듈 에서 항목을 가져올 수 있도록 sys.path를 수정 conftest.py하기 때문에 프로젝트 루트 디렉토리에 빈 파일을 넣으면 됩니다 . 일반적인 디렉토리 구조는 다음과 같습니다.pytestconftest

Root
├── conftest.py
├── module1
   ├── __init__.py
   └── sample.py
└── tests
    └── test_sample.py

1

비슷한 문제가 있었고 __init__.py테스트 디렉토리 에 파일을 추가했을 때 작동했습니다 .


0

Python은 (경로 문제로 인해) Pytest가 Python 모듈로 패키지를 읽지 않을 수 있습니다. pytest 스크립트의 디렉토리를 변경하거나 모듈을 PYTHONPATH에 명시 적으로 추가하십시오.

또는 컴퓨터에 두 가지 버전의 Python이 설치되어있을 수 있습니다. Python 소스에서 pytest 및 실행하는 Python 셸을 확인합니다. 다른 경우 (예 : Python 2 대 3)을 사용 source activate하여 모듈이 설치된 동일한 Python에 대해 설치된 pytest를 실행하고 있는지 확인하십시오.


0

모든 것을 시도했지만 여전히 오류가 발생하는 사람을 위해 해결 방법이 있습니다.

에서 pytest가 설치되어있는 폴더 로 이동 pytest-ENV의 폴더.

pyvenv.cfg 파일을 엽니 .

파일에서 include-system-site-packagesfalse 에서 true로 변경하십시오 .

home = /usr/bin
include-system-site-packages = true
version = 3.6.6

그것이 효과가 있기를 바랍니다. 투표하는 것을 잊지 마십시오.


0

.pyc 파일이 이미있는 경우 삭제 해보십시오.

오늘 나는이 문제에 직면했습니다.

먼저 Mac에서 pytest를 실행하고 (이것은 pyc 파일을 생성합니다) 프로젝트 디렉토리가 마운트 된 도커 컨테이너 (OS는 알파인)를 시작한 다음 컨테이너에서 pytest를 실행하려고하면 ImportError가 발생합니다. 모든 pyc 파일을 정리 한 후 더 이상 오류가 없습니다.

이것이 도움이되기를 바랍니다.


0

폴더에 init .py 파일 이 필요한 경우 폴더의 복사본을 만들고 init .py를 삭제 하여 테스트를 실행하면 로컬 프로젝트에서 작동합니다. 정기적으로 테스트를 실행해야하는 경우 init .py를 별도의 파일 로 이동할 수 있는지 확인하십시오 .


0

[해결됨]를 제거 / 추가하는 솔루션으로 직접 이동하기 전에 __init__.py클래스에서 가져 오기가 어떻게 수행되었는지 살펴볼 수도 있습니다. 사실, 그게 __init__.py문제일지도 모른다고 생각하고 놀면서 하루를 잃었습니다. :) 그러나 그것은 매우 유익했습니다.

제 경우에는 하나의 파이썬 클래스에서 던지는 다른 파이썬 클래스로 클래스를 호출하는 잘못된 방법이었습니다 ImportError. 클래스 / 모듈이 호출되는 방식을 수정하고 매력처럼 작동했습니다. 희망, 이것은 다른 사람들에게도 도움이됩니다.

예, 유사한 오류의 경우 코드 작성 방법에 따라 다른 솔루션이있을 수 있습니다. 자체 디버깅에 더 많은 시간을 할애하는 것이 좋습니다. 배운 교훈 :) 즐거운 코딩 !!!


1
잘못된 방법과 올바른 방법에 대한 몇 가지 예를 들어 주시겠습니까?
Lurifaxel

0

제 경우에는 컨테이너에서 작업하고 있으며 불행히도 pytest는 선택한 python3 인터프리터 대신 python2.7을 사용하는 경향이 있습니다.

제 경우에는 다음과 같이 작동했습니다.

python3 -m pytest

내 폴더 구조

/
app/
-module1.py
-module2.py
-tests/
--test_module1.py
--test_module2.py
requirements.txt
README.md

-1

모든 테스트를 테스트 폴더에 배치했는데 동일한 오류가 발생했습니다. 다음 과 같이 해당 폴더에 init .py를 추가하여이 문제를 해결했습니다 .

.
|-- Pipfile
|-- Pipfile.lock
|-- README.md
|-- api
|-- app.py
|-- config.py
|-- migrations
|-- pull_request_template.md
|-- settings.py
`-- tests
    |-- __init__.py <------
    |-- conftest.py
    `-- test_sample.py
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.