티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

beyond top level package error in relative import

"ValueError: attempted relative import beyond top-level package" 문제 수정

 문제 내용 

It seems there are already quite some questions here about relative import in python 3, but after going through many of them I still didn't find the answer for my issue. so here is the question.

파이썬 3의 relative import에 대해 이미 꽤 많은 질문이 있는 것 같지만, 그 중 많은 질문을 겪은 후에도 나는 여전히 내 문제에 대한 답을 찾지 못했다. 그래서 여기 질문이 있습니다.

 

I have a package shown below

아래와 같은 패키지가 있습니다.

 

package/
   __init__.py
   A/
      __init__.py
      foo.py
   test_A/
      __init__.py
      test.py

and I have a single line in test.py:

그리고 나는 test.py에 한 줄밖에 없다:

 

from ..A import foo

now, I am in the folder of package, and I run

지금, 나는 패키지 폴더에 있고, 나는 실행한다.

 

python -m test_A.test

I got message

메시지가 왔어요.

 

"ValueError: attempted relative import beyond top-level package"

but if I am in the parent folder of package, e.g., I run:

그러나 패키지의 상위 폴더에 있는 경우, 예를 들어 다음을 실행합니다.

 

cd ..
python -m package.test_A.test

everything is fine.

모든 것이 다 좋습니다.

 

Now my question is: when I am in the folder of package, and I run the module inside the test_A sub-package as test_A.test, based on my understanding, ..A goes up only one level, which is still within the package folder, why it gives message saying beyond top-level package. What is exactly the reason that causes this error message?

제 질문은 다음과 같습니다. 패키지 폴더에 있을 때 test_A 하위 패키지를 test_A.test로 모듈을 실행합니다. 제가 이해한 바에 따르면,A는 패키지 폴더 내에 있는 한 단계만 올라갑니다. 왜 최상위 패키지를 넘어서 메시지를 제공합니까? 이 오류 메시지가 발생하는 정확한 이유는 무엇입니까?

 

 

 

 높은 점수를 받은 Solution 

EDIT: There are better/more coherent answers to this question in other questions:

편집: 다른 질문에서 이 질문에 대한 더 나은/더 일관된 답변이 있습니다.

 

 


Why doesn't it work? It's because python doesn't record where a package was loaded from. So when you do python -m test_A.test, it basically just discards the knowledge that test_A.test is actually stored in package (i.e. package is not considered a package). Attempting from ..A import foo is trying to access information it doesn't have any more (i.e. sibling directories of a loaded location). It's conceptually similar to allowing from ..os import path in a file in math. This would be bad because you want the packages to be distinct. If they need to use something from another package, then they should refer to them globally with from os import path and let python work out where that is with $PATH and $PYTHONPATH.

왜 안 되는 거야? 파이썬은 패키지가 어디서 로드되었는지 기록하지 않기 때문입니다. 따라서 python-m test_A.test를 실행하면 test_A.test가 실제로 패키지에 저장된다는 지식만 무시됩니다(즉, 패키지는 패키지로 간주되지 않음). 에서 시도 중입니다.가져오기 foo가 더 이상 가지고 있지 않은 정보(예: 로드된 위치의 형제 디렉토리)에 액세스하려고 합니다. 이것은 개념적으로 수학에서 파일의 .os 가져오기 경로를 허용하는 것과 비슷합니다. 패키지가 구별되기를 원하기 때문에 이것은 좋지 않을 것입니다. 만약 그들이 다른 패키지의 무언가를 사용해야 한다면, 그들은 from os Import 경로로 전역적으로 그것들을 참조하고 python이 $PATH와 $PYthonPATH로 어디에 있는지 알아내도록 해야 한다.

 

When you use python -m package.test_A.test, then using from ..A import foo resolves just fine because it kept track of what's in package and you're just accessing a child directory of a loaded location.

python-m 패키지를 사용할 때.test_A.test, 그리고 from을 사용합니다.가져오기 foo는 패키지에 있는 내용을 추적하고 로드된 위치의 하위 디렉토리에 액세스하기만 하면 되므로 문제가 해결됩니다.

 

Why doesn't python consider the current working directory to be a package? NO CLUE, but gosh it would be useful.

왜 파이썬은 현재 작업 디렉토리를 패키지로 간주하지 않는가? 단서는 없지만, 세상에, 그것은 유용할 것이다.

 

 

 

 가장 최근 달린 Solution 

Just remove .. in test.py For me pytest works fine with that
Example:

제거하기만 하면 됩니다. 시험 중에파이의 내 경우 파이 테스트는 그것과 함께 잘 작동한다. 예:

 

from A import foo

 

 

출처 : https://stackoverflow.com/questions/30669474/beyond-top-level-package-error-in-relative-import

반응형
댓글
공지사항
최근에 올라온 글