저는 파이썬으로 패키지 작업을하고 있습니다. 나는 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__.py
pytest를 사용할 계획이라면 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
) 넣었습니다.python
pytest
BOTTOM LINE : 이렇게하면 python
가져 오는 패키지가를 실행할 때 패키지와 다를 수 있습니다 pytest
.