Python 스크립트에서 모듈을 가져 오는 벽에 부딪 혔습니다. 오류를 설명하기 위해 최선을 다하고 오류가 발생하는 이유와 문제를 해결하기 위해이 특정 접근 방식을 사용하는 이유 (잠시 후 설명하겠습니다) :
이 보조 모듈을 가져올 네임 스페이스에 정의 된 엔터티를 참조하는 일부 유틸리티 함수 / 클래스를 정의한 모듈이 있다고 가정 해 보겠습니다 ( "a"를 이러한 엔터티로 지정).
module1 :
def f():
print a
그리고 "a"가 정의 된 메인 프로그램이 있는데,이 프로그램으로 유틸리티를 가져 오려고합니다.
import module1
a=3
module1.f()
프로그램을 실행하면 다음 오류가 발생합니다.
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in <module>
module1.f()
File "Z:\Python\module1.py", line 3, in f
print a
NameError: global name 'a' is not defined
비슷한 질문이 과거 (이틀 전 d' uh)에 제기되었으며 몇 가지 해결책이 제안되었지만 이것이 제 요구 사항에 맞지 않는다고 생각합니다. 내 특정 컨텍스트는 다음과 같습니다.
MySQL 데이터베이스 서버에 연결하고 GUI로 데이터를 표시 / 수정하는 Python 프로그램을 만들려고합니다. 청결을 위해 별도의 파일에 보조 / 유틸리티 MySQL 관련 함수를 정의했습니다. 그러나 그들은 모두 내가 원래 유틸리티 모듈 내부 에 정의 하고 MySQLdb 모듈 의 커서 객체 인 공통 변수를 가지고 있습니다. 나중에 db 서버와 통신하는 데 사용되는 커서 개체가 주 모듈에 정의되어 주 모듈과 여기로 가져온 모든 것이 해당 개체에 액세스 할 수 있어야 한다는 것을 나중에 깨달았습니다 .
최종 결과는 다음과 같습니다.
utility_module.py :
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
그리고 내 주요 모듈 :
program.py :
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
그리고 유틸리티 함수를 호출하려고하면 앞서 언급 한 "글로벌 이름이 정의되지 않음"오류가 발생합니다.
특별한 제안은 다음과 같이 유틸리티 파일에 "from program import cur"문을 포함하는 것이 었습니다.
utility_module.py :
from program import cur
#rest of function definitions
program.py :
import Tkinter, MySQLdb
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
그러나 그것은 주기적 수입이나 그와 비슷한 것이고, 결론적으로도 충돌합니다. 그래서 제 질문은 :
도대체 어떻게 메인 모듈에 정의 된 "cur"객체를 가져 오는 보조 기능에 보이게 할 수 있습니까?
시간을 내 주셔서 감사합니다. 솔루션이 다른 곳에 게시 된 경우 진심으로 사과드립니다. 나는 스스로 답을 찾을 수 없으며 책에 더 이상 속임수가 없습니다.
db
(그리고 cur
, 당신이 주장하는 경우) 모두가 별도의 모듈로 program
와 utilities_module
에서 가져옵니다. 이렇게하면 순환 종속성 (프로그램이 가져 오는 모듈에서 프로그램 가져 오기)과 그에 따른 혼동이 발생하지 않습니다.
fetch_all
두 개의 목록을 반복하는 대신 잠금 단계에서 두 개의 커서를 반복 할 수 있습니다. 또는 충돌없이 데이터베이스를 사용하여 두 개의 다른 스레드 / 그린 렛 / 콜백 체인 / 무엇이든 사용할 수 있습니다.