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

저는 파이썬으로 패키지 작업을하고 있습니다. 나는 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’오류를 검색하고 스택 오버플로했지만 내가 얻은 히트는 파이썬 경로 누락과 관련이 있으며 여기에서 문제가되지 않는 것 같습니다. 어떤 제안?



답변

답을 찾았습니다.

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

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


답변

이것이 작동하는 이유를 이해한다고 말할 수는 없지만 동일한 문제가 있었고 실행하면 테스트가 잘 작동합니다 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


답변

내 프로젝트 루트에서 __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


답변

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

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

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


답변

이 문제는 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존재

답변

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

sudo pip install ./ --upgrade

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


답변

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

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

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