IT이야기

두 개의 Python 모듈에는 서로의 내용이 필요한 경우

cyworld 2021. 9. 23. 22:41
반응형

두 개의 Python 모듈에는 서로의 내용이 필요합니다. 작동할 수 있습니까?


다음 줄이 있는 Bottle 웹 서버 모듈이 있습니다.

from foobar.formtools import auto_process_form_insert

그리고 foobar.formtools모듈에는 다음 줄이 포함되어 있습니다.

from foobar.webserver import redirect, redirect_back

물론 둘 다 다음과 같은 오류가 발생합니다(각각).

ImportError: 이름 auto_process_form_insert를 가져올 수 없습니다.
ImportError: 이름 리디렉션을 가져올 수 없습니다.

단순히 파이썬에서 두 개의 모듈이 서로를 가져올 수 없고 모든 모듈 가져오기가 본질적으로 계층적이어야 한다는 사실입니까, 아니면 제가 뭔가 잘못하고 있습니까? 또는 이러한 모든 멋진 기능을 새 모듈에 배치하지 않는 해결 방법이 있습니까?


모듈 주기적으로 서로 가져올 있지만 문제가 있습니다. 간단한 경우에는 import명령문을 파일 맨 아래 로 이동 하거나 from구문을 사용하지 않는 방식으로 작동해야 합니다.

작동하는 이유는 다음과 같습니다.

모듈을 가져올 때 Python은 먼저 sys.modules. 거기에 있으면 거기에서 가져옵니다. 없는 경우 정상적인 방법으로 가져오려고 합니다. 기본적으로 파일을 찾고 그 안의 내용을 실행합니다.

모듈을 실행하면 모듈의 내용이 채워집니다. 예를 들어, 창의적으로 명명된 이 모듈이 있다고 가정해 보겠습니다 example_opener.

import webbrowser

def open_example():
    webbrowser.open('http://www.example.com/')

처음에는 모듈이 비어 있습니다. 그런 다음 Python은 다음을 실행합니다.

import webbrowser

그 이후에는 모듈에만 webbrowser. 그런 다음 Python은 다음을 실행합니다.

def open_example():
    webbrowser.open('http://www.example.com/')

파이썬은 open_example. 이제 모듈에는 webbrowser가 포함 open_example됩니다.

webbrowser다음 코드가 포함되어 있다고 가정해 보겠습니다 .

from example_opener import open_example

def open(url):
    print url

example_opener먼저 수입 된다고 합니다 . 다음 코드가 실행됩니다.

import webbrowser

webbrowser아직 가져오지 않았으므로 Python은 다음 내용을 실행합니다 webbrowser.

from example_opener import open_example

example_opener 이는 가져 왔지만 아직 완전히 실행되지되었다. 파이썬은 상관하지 않습니다. 파이썬은 모듈을 sys.modules. 이 시점에서 example_opener여전히 비어 있습니다. open_example아직 정의 되지 않았으며 가져오기도 완료되지 않았습니다 webbrowser. Python은 open_example에서 찾을 수 없으므로 example_opener실패합니다.

우리가 수입하는 경우 open_example의 끝에서 webbrowserwebbrowser의 끝에서 example_opener? Python은 다음 코드를 실행하여 시작합니다.

def open_example():
    webbrowser.open('http://www.example.com/')

webbrowser아직 존재하지 않지만 open_example가 호출 될 때까지는 중요하지 않습니다 . 이제 example_opener만 포함합니다 open_example. 그런 다음 다음을 실행합니다.

import webbrowser

아직 가져오지 않았으므로 Python이 실행 webbrowser됩니다. 시작하다:

def open(url):
    print url

정의합니다 open. 그런 다음 다음을 실행합니다.

from example_opener import open_example

example_opener is in sys.modules, so it uses that. example_opener contains open_example, so it succeeds. Python finishes importing webbrowser. That concludes importing webbrowser from example_opener. That's the last thing in example_opener, so the import of example_opener finishes, successful, as well.


Don't do from ... import .... Just do import ... and reference its objects using the module name.

ReferenceURL : https://stackoverflow.com/questions/11698530/two-python-modules-require-each-others-contents-can-that-work

반응형