10억 번째 상대 수입액
여기 온 적 있어요
- http://www.python.org/dev/peps/pep-0328/
- http://docs.python.org/2/tutorial/modules.html#packages
- Python 패키지: 상대 Import
- python 상대 가져오기 예제 코드가 작동하지 않습니다.
- python 2.5에서의 상대 Import
- Python에서의 상대 Import
- Python: 상대 가져오기 사용 안 함
SO나 다른 사이트에서 복사하지 않은 URL도 많았습니다.그때 솔루션을 빨리 찾을 수 있을 것 같았습니다.
항상 반복되는 질문은 이 "Attempted relative import in non-package" 메시지를 어떻게 해결하느냐입니다.
ImportError: attempted relative import with no known parent package
pep-0328에 패키지의 정확한 레플리카를 작성했습니다.
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
Import는 콘솔에서 수행되었습니다.
적절한 모듈에 스팸과 에그라는 이름의 기능을 만들었습니다.당연히, 그것은 효과가 없었다.그 답은 제가 나열한 4번째 URL에 있는 것 같습니다만, 모두 제 동창입니다.방문한 URL 중 하나에 다음과 같은 응답이 있었습니다.
상대 Import에서는 모듈의 이름 속성을 사용하여 패키지 계층에서 해당 모듈의 위치를 결정합니다.모듈 이름에 패키지 정보가 포함되어 있지 않은 경우(예를 들어 '메인'으로 설정됨), 파일 시스템의 실제 위치에 관계없이 모듈이 최상위 모듈인 것처럼 상대적인 Import가 해결됩니다.
위의 답변은 유망해 보이지만, 나에게는 모두 상형문자입니다.그래서 어떻게 하면 Python이 "비패키지 내 상대적인 Import 시도"를 받지 않게 할 수 있을까요?아마 -m과 관련된 답을 가지고 있을 겁니다
Python이 왜 그 에러 메시지를 주는지, "비패키지"가 무엇을 의미하는지, 왜 그리고 어떻게 "패키지"를 정의하는지, 그리고 유치원생이 이해할 수 있을 정도로 정확한 답을 설명해 줄 수 있나요?
스크립트 vs.모듈
여기 설명이 있습니다.즉, Python 파일을 직접 실행하는 것과 다른 곳에서 파일을 가져오는 것 사이에는 큰 차이가 있습니다.파일이 어떤 디렉토리에 있는지 아는 것만으로 Python이 어떤 패키지에 있다고 생각하는지는 결정되지 않습니다.또한 Python에 파일을 로드하는 방법(실행 또는 Import)에 따라 달라집니다.
파이썬 이치노됩니다.python myfile.py커맨드 라인에 표시됩니다.됩니다.import하다한 번에 1개의 최상위 스크립트만 사용할 수 있습니다. 최상위 스크립트는 작업을 시작하기 위해 실행한 Python 파일입니다.
명명
됩니다(파일은 이름에 됩니다).__name__속성)을 참조해 주세요.
- 최상위 스크립트로 로드된 경우 이름은 다음과 같습니다.
__main__. - 그은 [그 또는 이 도트로 입니다를 들어 [filename( 「 」 , 「 」 ) 。
package.subpackage1.moduleX.
<고객명>을 로드하면 <고객명>님이 주의하시기 바랍니다.moduleX할 수 있습니다.python -m package.subpackage1.moduleX , . . . . . . . .__name__ 남아 있다__main__.
예를 들어 다음과 같습니다.
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleA.py
를 Import한 moduleX(주의: Import, 직접 실행되지 않음), 이름은 다음과 같습니다.package.subpackage1.moduleX.를 Import한 Import import경moduleA, 그 이름은 다음과 같습니다.package.moduleA단, 직접 실행하는 경우 moduleX에서 그 """로 됩니다.__main__를 직접 moduleA라인에서 그 은 " " " " 입니다.__main__하면 일반 되고 대신 모듈 이 "이 "이름이 __main__.
포함된 패키지를 통해 모듈에 액세스하지 않음
을 하다모듈의 이름은 해당 모듈의 디렉토리에서 "직접" Import했는지 또는 패키지를 통해 Import했는지에 따라 달라집니다.이것은 Python을 디렉토리에서 실행하고, 같은 디렉토리(또는 그 서브 디렉토리)에 파일을 Import하려고 하는 경우에만 다릅니다.를 들어, Python 는, Python 를 기동합니다.package/subpackage1 ㅇㅇㅇㅇㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹ.import moduleX의 , " " "moduleX그냥 그렇게 될 것이다moduleX가 package.subpackage1.moduleX이것은 Python이 인터프리터를 대화식으로 입력하면 현재 디렉토리를 검색 경로에 추가하기 때문입니다.현재 디렉토리에서 Import할 모듈을 발견하면 해당 디렉토리가 패키지의 일부라는 것을 인식하지 못하고 패키지 정보가 모듈 이름의 일부가 되지 않습니다.
를 들어, 「인터프리터」를 ).pythonPython python python python python python python python python python python python python python python python python python python 。이 경우 인터랙티브세션의 이름은 다음과 같습니다.__main__.
다음으로 에러 메시지에서 중요한 것을 나타냅니다.모듈 이름에 점이 없으면 패키지의 일부로 간주되지 않습니다.파일이 실제로 디스크 상의 어디에 있는지는 중요하지 않습니다.중요한 것은 이름뿐이며, 이름은 로드 방법에 따라 달라집니다.
이제 질문에 포함된 견적을 살펴보십시오.
상대 Import에서는 모듈의 이름 속성을 사용하여 패키지 계층에서 해당 모듈의 위치를 결정합니다.모듈 이름에 패키지 정보가 포함되어 있지 않은 경우(예를 들어 '메인'으로 설정됨), 모듈이 파일 시스템 상의 실제 위치에 관계없이 모듈이 최상위 모듈인 것처럼 상대적인 Import가 해결됩니다.
상대 Import...
상대 Import에서는 모듈 이름을 사용하여 모듈 패키지의 위치를 결정합니다.다음과 같은 상대 가져오기를 사용하는 경우from .. import foo도트는 패키지 계층에서 몇 가지 레벨을 올리는 것을 나타냅니다.들어 현재이 " "인 경우" 입니다.package.subpackage1.moduleX , , , 「 」..moduleA,를합니다.package.moduleA ★★★★의 경우from .. import에 적어도의 점(에 점만큼 점이 .import★★★★★★ 。
...패키지 내에는 상대적인 관계만 있습니다.
모듈 이 " "일 " " 입니다.__main__패키지에 포함되어 있지 않은 것으로 간주됩니다.할 수 .from .. import아!비수입의 상대 수입
스크립트에서 상대 항목을 가져올 수 없습니다.
이 한 짓은 아마 하려고 한 입니다.moduleX커맨드 라인에 표시됩니다.작업을 수행했을 때 은 ""로 되었습니다.__main__즉, 그 이름이 패키지에 들어 있는 것을 나타내지 않기 때문에 그 안에 있는 상대적인 Import는 실패합니다.Python을 모듈이 있는 같은 디렉토리에서 실행한 후 해당 모듈을 Import하려고 하면 Python은 패키지의 일부라는 것을 깨닫지 못하고 현재 디렉토리에서 모듈을 "너무 일찍" 찾을 수 있기 때문에 이 문제가 발생할 수도 있습니다.
할 때 은 항상 "이름"입니다.__main__따라서 대화형 세션에서 직접 상대 Import를 수행할 수 없습니다.상대 Import는 모듈파일 내에서만 사용할 수 있습니다.
두 가지 솔루션:
moduleX하고 싶은 '포장하다'를 할 수 .python -m package.subpackage1.moduleX. 。-m는 Python에게 최상위 스크립트가 아닌 모듈로 로드하도록 지시합니다.아니면 실제로 달리고 싶지 않을 수도 있다.
moduleX대본을 해 보고myfile.py내부 기능을 사용합니다.moduleX'아까보다'를 붙이고,myfile.py다른 장소 – 내부가 아닌package및 실행.directory – 를 합니다.에 있는myfile.py를 해요.from package.moduleA import spam정상적으로 동작합니다.
메모들
어느 는, 디렉토리 「」 「」 「」, 「」)가 됩니다.
package경로Python 모듈 검색 경로)에서 수 있어야 .sys.path그렇지 않으면 패키지 내의 어떤 것도 확실하게 사용할 수 없습니다..6 은 Python 2..
__name__어트리뷰트뿐만 아니라__package__기여하다.그래서 내가 명시적 기호를 사용하는 것을 피하고 있는 거야__name__모듈의 "이름"을 참조합니다.Python 2.6 이후 모듈의 "이름"은__package__ + '.' + __name__또는 그냥__name__한다면__package__이None.)
이것은 비단뱀 내부의 문제입니다.혼란의 원인은 사람들이 상대적인 수입을 그렇지 않은 경로의 상대적인 것으로 잘못 받아들였기 때문이다.
예를 들어 faa로 쓸 때.py:
from .. import foo
이는 실행 중 python에 의해 패키지의 일부로 식별되고 로드된 경우에만 의미가 있습니다.이 경우 faa.py 모듈의 이름은 some_packagename.faa 등입니다.파일이 현재 디렉토리에 있기 때문에 로딩된 경우 python이 실행되면 그 이름은 어떤 패키지도 참조하지 않고 결국 상대적인 Import가 실패합니다.
현재 디렉토리의 모듈을 참조하는 간단한 해결책은 다음과 같습니다.
if __package__ is None or __package__ == '':
# uses current directory visibility
import foo
else:
# uses current package visibility
from . import foo
외국어는 답변자가 너무 많다.그래서 짧게 할게요.
쓰시면from . import module당신이 생각하는 것과는 정반대해서module현재 디렉터리에서 가져오지 않고 패키지의 최상위 수준에서 가져옵니다.스크립트로 .py 파일을 실행하면 최상위 수준을 알 수 없기 때문에 작업을 거부합니다.
이렇게 시작하면py -m package.module위 디렉토리에서package그러면 python은 최상위 레벨의 위치를 알 수 있습니다.이는 java와 매우 유사합니다.java -cp bin_directory package.class
그래서 다른 많은 사람들과 함께 이것에 대해 이야기한 후, 나는 이 기사에서 Dorian B가 올린 노트를 발견했는데, 그것은 내가 웹 서비스와 함께 사용할 수 있는 모듈이나 클래스를 개발해야 하는 구체적인 문제를 해결한 것이지만, PyCharm의 디버거 기능을 사용하여 코딩하면서 그것들을 테스트할 수 있기를 바란다.독립형 클래스에서 테스트를 실행하려면 클래스 파일 끝에 다음 항목을 포함합니다.
if __name__ == '__main__':
# run test code here...
하지만 같은 폴더에 다른 클래스나 모듈을 Import하려면 모든 Import 스테이트먼트를 상대 표기법에서 로컬 참조로 변경해야 합니다(즉, 점(.)). 하지만 Dorian의 제안을 읽은 후 Dorian의 '원라이너'를 사용해보니 효과가 있었습니다!이제 PyCharm에서 테스트하고 테스트 대상 다른 클래스에서 사용할 때나 웹 서비스에서 사용할 때 테스트 코드를 그대로 둘 수 있습니다.
# import any site-lib modules first, then...
import sys
parent_module = sys.modules['.'.join(__name__.split('.')[:-1]) or '__main__']
if __name__ == '__main__' or parent_module.__name__ == '__main__':
from codex import Codex # these are in same folder as module under test!
from dblogger import DbLogger
else:
from .codex import Codex
from .dblogger import DbLogger
if 문은 이 모듈이 메인모듈로 실행되고 있는지 또는 메인모듈로 테스트되고 있는 다른 모듈에서 사용되고 있는지 확인합니다.이것은 당연한 일이지만, 위의 상대적인 수입 문제로 인해 좌절하고 있는 다른 누군가가 그것을 이용할 수 있는 경우에 대비하여 여기에 이 메모를 제공합니다.
여기 일반적인 레시피가 있습니다.예를 들어, 패키지로 작성된 Python 라이브러리를 취급하기 위해 사용하고 있습니다.Python 라이브러리는 상호의존적인 파일을 포함하고 있으며, 그 일부를 단편적으로 테스트할 수 있도록 하고 싶습니다.이것으로 끝냅시다lib.foo그리고 그것은 에 대한 접근이 필요하다고 말한다.lib.fileA기능용f1그리고.f2,그리고.lib.fileB수업용Class3.
몇 개 포함했습니다.print이 기능의 설명에 도움이 되는 전화입니다.실제로는 그것들을 제거하고 싶은 경우가 있습니다(또한from __future__ import print_function회선)
이 예시는 너무 단순해서 엔트리를 삽입할 필요가 있는 타이밍을 알 수 없습니다.sys.path(필요한 경우, 패키지 디렉토리가 2레벨 이상 있는 경우, 그 후 를 사용하는 경우는, Lars 의 답변을 참조해 주세요.os.path.dirname(os.path.dirname(__file__))여기도 별로 아프지 않습니다.)또한 이 작업을 수행하는 데에도 안전합니다.if _i in sys.path단, Import된 각 파일이 같은 경로를 삽입하는 경우(예를 들어, 두 파일 모두fileA그리고.fileB패키지에서 유틸리티를 Import하고 싶다.이렇게 하면 복잡해집니다.sys.path여러 번 같은 길을 걸었기 때문에if _i not in sys.path보일러 플레이트 안에 있어요
from __future__ import print_function # only when showing how this works
if __package__:
print('Package named {!r}; __name__ is {!r}'.format(__package__, __name__))
from .fileA import f1, f2
from .fileB import Class3
else:
print('Not a package; __name__ is {!r}'.format(__name__))
# these next steps should be used only with care and if needed
# (remove the sys.path manipulation for simple cases!)
import os, sys
_i = os.path.dirname(os.path.abspath(__file__))
if _i not in sys.path:
print('inserting {!r} into sys.path'.format(_i))
sys.path.insert(0, _i)
else:
print('{!r} is already in sys.path'.format(_i))
del _i # clean up global name space
from fileA import f1, f2
from fileB import Class3
... all the code as usual ...
if __name__ == '__main__':
import doctest, sys
ret = doctest.testmod()
sys.exit(0 if ret.failed == 0 else 1)
이 아이디어는 다음과 같습니다(그리고 이것들은 모두 python2.7과 python 3.x에서 동일하게 기능합니다).
로 실행되는 경우
import lib또는from lib import foo통상적인 코드로부터의 패키지 Import로서__package이lib그리고.__name__이lib.foo첫 번째 코드 경로를 사용하여.fileA,기타.로 실행되는 경우
python lib/foo.py,__package__[없음(None)]가 됩니다.__name__될 것이다__main__.두 번째 암호 경로를 사용합니다.그
lib디렉토리가 이미 있습니다.sys.path추가할 필요가 없습니다.Import처fileA,기타.내에서 실행되는 경우
lib로 명기하다.python foo.py동작은 케이스2와 동일합니다.내에서 실행되는 경우
lib로 명기하다.python -m foo동작은 케이스2 및 3과 비슷합니다.단, 에의 패스lib디렉토리가 없습니다.sys.pathImport 전에 추가합니다.Python을 실행하고 나서import foo.(이후)
.인sys.path여기서 경로의 절대 버전을 추가할 필요는 없습니다.이것이 보다 깊은 패키지 네스트 구조이며, 우리가 원하는 바입니다.from ..otherlib.fileC import ...에는 차이가 있습니다.이거 안 할 거면 다 빼도 돼요.sys.path조작을 실시합니다).
메모들
아직 별난 게 있다.이 모든 걸 외부에서 실행한다면:
$ python2 lib.foo
또는 다음과 같이 입력합니다.
$ python3 lib.foo
그 행동은 내용에 따라 다르다lib/__init__.py이 항목이 존재하고 비어 있으면 모든 것이 정상입니다.
Package named 'lib'; __name__ is '__main__'
하지만 만약lib/__init__.py 수입품 자체routine수출할 수 있도록routine.name로서 직접lib.name, 다음과 같은 것이 있습니다.
$ python2 lib.foo
Package named 'lib'; __name__ is 'lib.foo'
Package named 'lib'; __name__ is '__main__'
즉, 모듈은 패키지를 통해1회 Import된 후 다음 순서로2회 Import 됩니다.__main__그렇게 해서mainPython 3.6 이후 경고:
$ python3 lib.routine
Package named 'lib'; __name__ is 'lib.foo'
[...]/runpy.py:125: RuntimeWarning: 'lib.foo' found in sys.modules
after import of package 'lib', but prior to execution of 'lib.foo';
this may result in unpredictable behaviour
warn(RuntimeWarning(msg))
Package named 'lib'; __name__ is '__main__'
경고는 새롭지만 경고 동작은 새롭지가 않습니다.이것은 이른바 이중 Import 트랩의 일부입니다.(자세한 내용은 제27487호 참조).Nick Coghlan은 다음과 같이 말합니다.
이 다음 트랩은 3.3을 포함한 모든 최신 버전의 Python에 존재하며 "Python 경로에 패키지 디렉토리 또는 패키지 내부의 디렉토리를 직접 추가하지 마십시오."라는 일반적인 가이드라인에서 요약할 수 있습니다.
여기서 이 규칙을 위반하지만 로드 중인 파일이 패키지의 일부로 로드되지 않은 경우에만 이 규칙을 수행합니다.또한 수정 내용은 해당 패키지의 다른 파일에 액세스할 수 있도록 특별히 설계되었습니다.(또한 말씀드렸듯이 싱글 레벨 패키지에 대해서는 이 작업을 전혀 실시하지 않는 것이 좋습니다.)보다 깔끔하게 하려면 , 예를 들면 다음과 같이 고쳐 쓸 수 있습니다.
import os, sys
_i = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if _i not in sys.path:
sys.path.insert(0, _i)
else:
_i = None
from sub.fileA import f1, f2
from sub.fileB import Class3
if _i:
sys.path.remove(_i)
del _i
즉, 델은sys.path우리의 수입을 달성할 수 있을 만큼 충분히 길었고, 그리고 그것을 원래대로 되돌렸다(한 부 복사)._i카피 1개를 추가할 경우에만_i).
다음은 권장하지 않는 솔루션이지만 모듈이 생성되지 않은 경우에 도움이 될 수 있습니다.
import os
import sys
parent_dir_name = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(parent_dir_name + "/your_dir")
import your_script
your_script.a_function()
@BrenBarn의 답변이 모든 것을 말해주고 있지만, 나와 같은 사람이라면 이해하는데 시간이 걸릴지도 모른다.여기 제 사례가 있고 @BrenBarn의 답변이 어떻게 적용되는지 알려드립니다.
케이스
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleA.py
친숙한 예를 들어 moduleX.py이 ..moduleA에 상대적인 Import를 하고 있다는 것을 추가합니다.moduleX를 Import한 subpackage1 디렉토리에 테스트스크립트를 쓰려고 했지만 OP에 기재된 무서운 오류가 발생하였습니다.
솔루션
테스트 스크립트를 패키지 및 Import 패키지와 동일한 수준으로 이동합니다.서브패키지1.모듈X
설명.
상술한 바와 같이, 상대적인 수입은 현재의 명칭에 따라 이루어집니다.테스트 스크립트가 같은 디렉토리에서 moduleX를 Import할 경우 moduleX 내의 모듈명은 moduleX가 됩니다.상대 Import가 발생하면 패키지 계층이 이미 상위에 있으므로 인터프리터가 백업할 수 없습니다.
위에서 moduleX를 Import하면 moduleX의 이름이 package가 됩니다.subpackage1.moduleX 및 상대 Import를 찾을 수 있습니다.
Python 모듈 검색 경로를 변경하고 싶지 않아 스크립트에서 상대적으로 모듈을 로드해야 하는 유사한 문제가 있었습니다(위에서 BrenBarn이 잘 설명한 바와 같이 "스크립트는 모든 모듈을 Import할 수 없습니다"에도 불구하고).
그래서 나는 다음과 같은 해킹을 사용했다.유감스럽게도, 이것은imp버전 3.4 이후 폐지된 모듈importlib(이것이 가능합니까?importlib나도 몰라.)그래도 해킹은 지금으로선 통한다.
멤버 액세스 예시moduleX에subpackage1에 있는 스크립트에서subpackage2폴더:
#!/usr/bin/env python3
import inspect
import imp
import os
def get_script_dir(follow_symlinks=True):
"""
Return directory of code defining this very function.
Should work from a module as well as from a script.
"""
script_path = inspect.getabsfile(get_script_dir)
if follow_symlinks:
script_path = os.path.realpath(script_path)
return os.path.dirname(script_path)
# loading the module (hack, relying on deprecated imp-module)
PARENT_PATH = os.path.dirname(get_script_dir())
(x_file, x_path, x_desc) = imp.find_module('moduleX', [PARENT_PATH+'/'+'subpackage1'])
module_x = imp.load_module('subpackage1.moduleX', x_file, x_path, x_desc)
# importing a function and a value
function = module_x.my_function
VALUE = module_x.MY_CONST
보다 깔끔한 접근법은 Federico에서 언급한 대로 모듈 로드에 사용되는 sys.path를 변경하는 것입니다.
#!/usr/bin/env python3
if __name__ == '__main__' and __package__ is None:
from os import sys, path
# __file__ should be defined in this case
PARENT_DIR = path.dirname(path.dirname(path.abspath(__file__)))
sys.path.append(PARENT_DIR)
from subpackage1.moduleX import *
__name__해당 코드가 글로벌네임스페이스에서 실행되는지 Import된 모듈의 일부로 실행되는지 여부에 따라 달라집니다.
코드가 글로벌 공간에서 실행되고 있지 않으면__name__모듈 이름이 됩니다.글로벌 네임스페이스에서 실행 중인 경우(콘솔에 입력하거나 다음을 사용하여 스크립트로 모듈을 실행하는 경우 등)python.exe yourscriptnamehere.py그리고나서__name__된다"__main__".
많은 python 코드를 볼 수 있습니다.if __name__ == '__main__'는 코드가 글로벌네임스페이스에서 실행되고 있는지 여부를 테스트하기 위해 사용합니다.이것에 의해, 스크립트로서 기능하는 모듈을 설정할 수 있습니다.
콘솔에서 Import를 시도했습니까?
Lars가 제안한 내용에 따라 이 접근방식을 실험적인 새로운 Import 라이브러리로 정리했습니다: ultraimport
이를 통해 프로그래머는 Import를 보다 효과적으로 제어할 수 있으며 파일 시스템 기반 Import가 가능합니다.따라서 스크립트에서 상대 Import를 수행할 수 있습니다.부모 패키지는 필요 없습니다.ultraimport는 코드 실행 방법이나 현재 작업 디렉토리에 관계없이 항상 작동합니다. 왜냐하면 ultraimport는 Import를 명확하게 하기 때문입니다.sys.path를 변경할 필요가 없습니다.또한 상대적인 Import와 절대적인 Import를 수행하기 위해 try/except block도 필요하지 않습니다.
그런 다음 다음과 같이 somefile.py에 글을 남깁니다.
import ultraimport
foo = ultraimport('__dir__/foo.py')
__display__는 somefile.py의 디렉토리이며 ultraimport foo.py의 발신자는 somefile.py과 같은 디렉토리에 있습니다.
이와 같은 스크립트를 Import할 때 주의할 점은 상대적인 Import가 추가되어 있는지 여부입니다.ultraimport에는 후속 상대 Import를 ultraimport에 다시 쓰기 위한 프리프로세서가 내장되어 있어 계속 작동합니다.그러나, 이것은 현재 다소 제한적인데, 원래의 Python의 Import는 애매하고 당신이 할 수 있는 것은 한정되어 있기 때문입니다.
상대 Import에서는 모듈의 이름 속성을 사용하여 패키지 계층에서 해당 모듈의 위치를 결정합니다.모듈 이름에 패키지 정보가 포함되어 있지 않은 경우(예를 들어 '메인'으로 설정됨), 파일 시스템의 실제 위치에 관계없이 모듈이 최상위 모듈인 것처럼 상대적인 Import가 해결됩니다.
PyPi에 이 질문의 시청자에게 도움이 될만한 작은 비단뱀 패키지를 작성했습니다.패키지는 Import 파일의 디렉토리에 직접 있지 않고 패키지/프로젝트 내에서 상위 수준의 패키지를 포함하는 Import를 포함하는 python 파일을 실행할 수 있도록 하는 경우의 회피책으로 기능합니다.https://pypi.org/project/import-anywhere/
대부분의 경우,ValueError: attempted relative import beyond top-level package머리카락을 뽑으면 해결 방법은 다음과 같습니다.
파일 계층에서 한 단계 더 높여야 합니다.
#dir/package/module1/foo.py
#dir/package/module2/bar.py
from ..module1 import foo
Import 중bar.py에서 통역을 시작할 때dir/package/Import 프로세스가 현재 디렉토리를 넘지 않아도 오류가 발생합니다.
Import 중bar.py에서 통역을 시작할 때dir/성공할 것이다.
유닛 테스트의 경우도 마찬가지입니다.python3 -m unittest discover --start-directory=.에서 성공하다dir/, 단, 로부터가 아닙니다.dir/package/.
언급URL : https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time
'source' 카테고리의 다른 글
| 개체를 문자열로 변환 (0) | 2022.09.22 |
|---|---|
| 시간 범위 내에서 5분 간격으로 그룹화 (0) | 2022.09.22 |
| 오브젝트 길이를 얻는 방법 (0) | 2022.09.22 |
| JavaScript가 멀티스레딩을 지원하지 않는 이유는 무엇입니까? (0) | 2022.09.22 |
| JS 개체를 폼 데이터로 변환 (0) | 2022.09.22 |