programing

pytest 'ImportError: YadaYadaYada라는 이름의 모듈이 없습니다'의 PATH 문제

luckcodes 2022. 12. 27. 22:11

pytest 'ImportError: YadaYadaYada라는 이름의 모듈이 없습니다'의 PATH 문제

easy_install을 사용하여 Mac에 pytest를 설치하고 다음과 같은 파일 구조를 가진 프로젝트의 테스트를 작성하기 시작했습니다.

repo/
   |--app.py
   |--settings.py
   |--models.py
   |--tests/
          |--test_app.py

려려를 py.test이 repo의 합니다.

그러나 Linux 또는 Windows(둘 다 pytest 2.2.3)에서 같은 것을 시도하면 어플리케이션 경로에서 무언가를 처음 가져올 때마다 짖어댄다.를 들면, 「」라고 하는 것.from app import some_def_in_app

이러한 시스템에서 py.test를 실행하려면 PATH를 편집해야 합니까?경험해 본 사람 있나요?

py.test가 PYTONPATH 자체에 현재 디렉토리를 추가하지 않는 이유는 잘 모르겠습니다만, 여기 (저장소의 루트에서 실행되어야 하는) 회피책이 있습니다.

python -m pytest tests/

Python이 PYTONPATH에 현재 디렉토리를 추가하기 때문에 작동합니다.

「 」의 권장 pytest>=7 라고 하다를 합니다.pythonpath

★★★★★★★★★★★★★★★.pytest는, 「」를 서포트하는 새로운 했습니다.sys.path변경은 Configuration 값을 통해 이루어집니다.따라서 현재 솔루션은 훨씬 더 단순해졌고 더 이상 회피책이 필요하지 않습니다.

pyproject.toml§:

[tool.pytest.ini_options]
pythonpath = [
  "."
]

pytest.ini§:

[pytest]
pythonpath = .

되므로 rootdir는 rootdir를 기준으로 계산됩니다..repo로부터 「」를 참조해 주세요.sys.path★★★★★★★★★★★★★★★★★★,

레이아웃의 경우 여러 경로 항목도 허용됩니다.

repo/
├── src/
|   └── lib.py
├── app.py
└── tests
     ├── test_app.py
     └── test_lib.py

구성

[tool.pytest.ini_options]
pythonpath = [
  ".", "src",
]

또는

[pytest]
pythonpath = . src

app ★★★★★★★★★★★★★★★★★」lib로 이동sys.path

import app
import lib

둘 다 효과가 있습니다.

답변.pytest 버전에서는 다음과 같이 합니다.pytest<7 : "예" :conftest

은 빈 입니다.conftest.py repo/★★★★★★★★★★★★★★★★★★:

$ touch repo/conftest.py

로로그그그그다다.sys.path 끌어서 가는 마세요.PYTHONPATH 따라, 또는 「」, 「」를 배치합니다.__init__.py속하지 않는 디르(dir)로 변환합니다(사용).python -m pytestApteryx답변에서 제시된 바와 같이 좋은 해결책입니다!)

이후 프로젝트 디렉토리:

repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
     └── test_app.py

설명.

pytest '찾아보세요'를 .conftest테스트 컬렉션의 모듈을 사용하여 커스텀훅과 고정장치를 수집하고 이들 모듈로부터 커스텀개체를 Import하기 위해의 부모 디렉토리를 추가합니다(이 경우,repo디렉토리)를 참조해 주세요.

기타 프로젝트 구조

구조를 있는 는, 「다음에」를 .conftest.py패키지 root dir(패키지를 포함하지만 패키지 자체는 아니므로 패키지가 포함되지 않음)에서__init__.py예를 들어 다음과 같습니다.

repo
├── conftest.py
├── spam
│   ├── __init__.py
│   ├── bacon.py
│   └── egg.py
├── eggs
│   ├── __init__.py
│   └── sausage.py
└── tests
     ├── test_bacon.py
     └── test_egg.py

src

은 이음음음음음음음음음음음음음음 the the the the the the the the the the the the the the the 와 함께 사용할 수 있습니다.src장소)conftest.py src 명령어):

repo
├── src
│   ├── conftest.py
│   ├── spam
│   │   ├── __init__.py
│   │   ├── bacon.py
│   │   └── egg.py
│   └── eggs 
│       ├── __init__.py
│       └── sausage.py
└── tests
     ├── test_bacon.py
     └── test_egg.py

src로로 합니다.PYTHONPATHsrc! 되어 있는 가 아니고, 에서 코드를 하게 됩니다설치된 패키지가 아닌 저장소에서 코드를 테스트하게 됩니다. 한다면 굳이 수도 요.src전혀 그렇지 않습니다.

여기서 어디로 가야 할까?

★★★★★★★★★★★★★★★★★.conftest검출에 이 되는 일 뿐만 아니라 을 모두 있습니다.프로젝트 고유의 기능 강화가 모두pytest테스트 스위트를 커스터마이즈할 수 있습니다. pytest에 대한 많은 가 있습니다.conftest문서 전체에 분산된 모듈: 디렉토리 단위의 로컬플러그인

SO는 SO에 대한 .conftest모듈:py.test에서 conftest.py 파일의 용도는 무엇입니까?

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.__init__.py 으로 줄서다tests디렉토리로 이동합니다.

Python을 하는 경우 소스 폴더가 Python.cd directory.로

2가지 선택지가 있습니다.

  1. 다음과 같이 수동으로 테스트 파일에 경로를 추가합니다.

    import sys, os
    myPath = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, myPath + '/../')
    
  2. var env var를 를 합니다.PYTHONPATH=../.

실행합니다.pytest수 .python -m pytest tests

프로젝트 루트에서 PYTONPATH로 실행할 수 있습니다.

PYTHONPATH=. py.test

또는 편집 가능한 Import로 pip install을 사용합니다.

pip install -e .   # install package using setup.py in editable mode

플라스크에서도 같은 문제가 있었어요.

추가 시:

__init__.py

폴더를 테스트하기 위해 문제가 사라졌습니다. : )

응용 프로그램이 폴더 테스트를 모듈로 인식하지 못할 수 있습니다.

저는 당신의 질문과 제 자신의 혼란에 대한 대답으로 이것을 만들었습니다.도움이 됐으면 좋겠어요.py.test 명령줄과 tox.ini 모두에서 PYTONPATH에 주의하십시오.

https://github.com/jeffmacdonald/pytest_test

구체적으로는:py.test 및 tox를 포함하는 모듈의 위치를 지정해야 합니다.

py.test를 사용하면 다음을 수행할 수 있습니다.

PYTHONPATH=. py.test

또한 tox를 사용하여 tox.ini에 추가합니다.

[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
    PYTHONPATH = {toxinidir}

요.__init__.py제 정보원의 부모 폴더에 있습니다.

는 점점 했다.ConftestImportFailure: ImportError('No module named ...해서 '오류'를 추가했을 때의 에러__init__.py파일을 src 디렉토리에 저장합니다(Python 패키지가 아니라 모든 소스의 컨테이너여야 함).

python에 문제가 있어서 조금 아쉽습니다...다만, 이 환경 변수를 추가하는 것이 가장 편리한 IMO 방법입니다.

export PYTHONPATH=$PYTHONPATH:.

이것을 .zshrc/.bashrc에 넣습니다.

플라스크 튜토리얼을 따를 때도 같은 문제가 있었습니다만, 공식 Pytest 문서에서 답을 찾았습니다.저(그리고 다른 많은 사람)의 작업 방식과는 조금 다른 것 같습니다.

'만들다'를 돼요.setup.py다음 두 줄 이상의 파일을 프로젝트의 루트 디렉토리에 저장합니다.

from setuptools import setup, find_packages
setup(name="PACKAGENAME", packages=find_packages())

여기서 PACKAGEName은 앱 이름입니다.그런 다음 pip을 사용하여 설치해야 합니다.

pip install -e .

-eflag는 pip에게 패키지를 편집 가능 모드 또는 "개발" 모드로 설치하도록 지시합니다.그래서 다음 번에 도망칠 때pytest은 표준 앱에서 수 .PYTHONPATH.

저도 비슷한 문제가 있었어요. pytest작업 환경에 설치된 모듈을 인식하지 못했습니다.

★★★★★★★★★★★★★★★★★★★★★도 인스톨 해 해결했습니다.pytest같은 환경으로의 전환이 가능합니다.

또, 만약 당신이 도망친다면pytest에서 ""를 합니다.pytest모듈이 가상 환경에 설치됩니다.하여 실행하세요.pip install pytest.

는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★였다.tests.py되었습니다.tests디렉토리로 이동합니다.「」의 삭제"tests.py제를해해 해해해다다

상대 수입품을 잘못 사용했기 때문에 이 오류가 발생하였습니다.OP 예제에서는 test_app.py가 예를 들어 함수를 Import해야 합니다.

from repo.app import *

그러나 __init_.py 파일은 자유롭게 파일 구조 주위에 분산되어 있어도 파일과 테스트 파일이 같은 디렉토리에 없는 한 동작하지 않고 ImportError가 생성됩니다.

from app import *

다음은 프로젝트 중 하나로 해야 할 일의 예입니다.

프로젝트 구조는 다음과 같습니다.

microbit/
microbit/activity_indicator/activity_indicator.py
microbit/tests/test_activity_indicator.py

test_activity_indicator.py 에서activity_indicator.py 에 액세스 하려면 , 다음의 조작이 필요했습니다.

  • 올바른 상대 Import를 사용하여 test_activity_interratory.py를 시작합니다.
    from microbit.activity_indicator.activity_indicator import *
  • 프로젝트 구조 전체에 __init_.py 파일을 저장합니다.
    microbit/
    microbit/__init__.py
    microbit/activity_indicator/__init__.py
    microbit/activity_indicator/activity_indicator.py
    microbit/tests/__init__.py
    microbit/tests/test_activity_indicator.py

이 에러는, 한층 더 간단한 것(사소한 것까지 생각할 수 있는 것)를 인스톨 하지 않았습니다.pytest모듈.그래서 심플하다apt install python-pytest쳐주주고

'pytest'는 테스트 의존관계로 setup.py에 기재되어 있습니다.테스트 요건도 인스톨 해 주세요.

에, , 시험지, 시험지, , 시험지, 시험지, , , 시험지, 시험지, 시험지, , , 시험지, 시험지, , 시험지, 시험지.pytest.ini 삭제:

[pytest]
...
testpaths = repo/tests

매뉴얼 참조:https://docs.pytest.org/en/6.2.x/customize.html#pytest-ini

VScode 부작용: UI에서 장치 테스트를 선택해야 합니다.

Dirk Avery의 Medium에 게재된 글(개인 경험상 지원)에 따르면 프로젝트에 가상 환경을 사용하는 경우 시스템 전체의 pytest 설치를 사용할 수 없습니다.가상 환경에 설치하고 그 설치를 사용해야 합니다.

되어 있는 는, 「」를 만 하면 .pytest명령어는 시스템 설치를 사용하기 때문에 작동하지 않습니다. 처럼 하나의 입니다.python -m pytestpytest; 이것은 환경 버전의 pytest를 사용하기 때문에 작동합니다.시스템도 있습니다. 환경을 한 후 pytest를 제거합니다.가상 환경을 다시 활성화한 후pytest명령어는 동작합니다.

Luiz Lezcano Arialdi가 지적한 바와 같이 올바른 해결책은 패키지를 편집 가능한 패키지로 설치하는 것입니다.

저는 pipenv를 사용하고 있기 때문에, 현재 패스를 pipenv와 함께 사용할 수 있는 형태로 설치하는 방법을 단계별로 그의 답변에 추가해서 magling code나 loose file 없이 pytest를 실행할 수 있도록 할까 생각했습니다.

다음과 같은 최소 폴더 구조(문서)가 필요합니다.

package/
    package/
        __init__.py
        module.py
    tests/
        module_test.py
    setup.py

setup.py의 대부분은 다음과 같은 미니엄 코드(정보)를 가지고 있습니다.

import setuptools


setuptools.setup(name='package', # Change to your package name
                 packages=setuptools.find_packages())

그냥 돼요.pipenv install --dev -e .pipenv는 현재 경로를 편집 가능한 패키지로 설치합니다(--dev 플래그는 옵션).

pytest문제없이.

다음과 같은 환경변수를 추가하여 문제를 해결하였습니다.

PYTHONPATH=${PYTHONPATH}:${PWD}/src:${PWD}/test

이 pytest 에러가 표시되는 경우는, 자신의 패키지가 아니고, 패키지의 요건에 따라 git 인스톨 된 패키지에 대해서입니다.txt는 편집 가능한 설치 모드로 전환합니다.

예를 들어 패키지의 요구 사항을 가정해 보겠습니다.txt에는 다음 행이 있습니다.

git+https://github.com/foo/bar.git

대신 다음과 같이 대체합니다.

-e git+https://github.com/foo/bar.git#egg=bar

모듈을 Import할 수 없기 때문에 테스트가 중단되는 경우가 매우 많았습니다.조사 결과, 시스템이 파일을 잘못 보고 있는 것을 알게 되었고, 모듈을 포함한 파일을 기재한 폴더와 같은 폴더에 복사하여 올바르게 Import를 올바르게 Import할 수 있습니다.다른 솔루션 제안으로는 Import 선언을 변경하여 MutPy에 유닛의 올바른 경로를 표시하는 방법이 있습니다.다만, 복수의 유닛이 이러한 의존성을 가질 수 있기 때문에, 그 유닛의 선언에서도 변경을 커밋할 필요가 있기 때문에, 그 유닛을 폴더로 간단하게 이동하는 것을 선호합니다.

솔루션:

conftest.pytest다음과 같이 합니다.

import os
import sys
sys.path.insert(0,os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/code/")

이렇게 하면 모든 테스트 파일을 수정하거나 env 변수를 설정하거나 절대/상대 경로를 조작하지 않고 관심 폴더를 python 경로에 추가할 수 있습니다.

언급URL : https://stackoverflow.com/questions/10253826/path-issue-with-pytest-importerror-no-module-named-yadayadayada