모듈 임포시 기존의 함수로 정의된 변수의 초기화 문제
조회수 1048회
문제점
NameError: name 'a' is not defined
접근과정
tkinter
를 활용해 UI용으로 만든 p1.py
파일과
p1.py
에서 command를 통해 실행할 파일 p2.py
파일이 있습니다.
궁극적인 목표는 p2.py
파일에서 어떤 파일의 파일 경로를 읽어내는 것입니다.
일단
p1.py
에tkinter.filedialog.askopenfilename
를 활용하여 얻은 파일의 경로를return
하는 함수fileopen()
를 만듭니다.def fileopen(): filepath = askopenfilename(parent=window, filetype=(("all files", "*.*")))
또,
fileopen()
하여 저장할 변수인a
를 만들고a
를global
로 전역변수로서 선언 하고p2.py
파일을import
하는 함수를 만듭니다. 이 함수는tkinter
로 만든 버튼을 클릭 시 실행되는 command로서 기능하게 됩니다.def c_color_rs_l(): global a a=fileopen() print(a) import p2
이후
c_color_rs_l
을 실행해보면a
에 정상적으로 filepath가 담겨있는 것을 확인가능합니다.하지만 p2를 import하게 되면
import p2
해서a
를 받아보면 불러낸 p1의 a가 정의되어 있지 않다고 합니다.
이게 실행되지 않는 이유는 제 생각에 아마도 p2에서 p1을 import할 때 [1]~[2]의 과정을 거치지 않고 import하기 때문에 a는 정의되어 있지 않은 것 같습니다.. 어떻게 고치면 좋을까여? 파이썬 고수님들...이걸로 뻥안치고 틀동안 쭉 고민하고 고쳐봤지만 잘 모르겠습니다.
접근과정2
제가 해본 또 다른 접근과정으로 p2에다 GUI 모듈인 tkinter.filedialog
를 임포트 하여 askopenfilename
를 실행시키게 되면 파일 경로는 잘 읽어냅니다.
그 후가 문제인데 GUI가 쓰레드 문제인가? (아직 뭐가 문제인지 정확히 몰라요.) 기존의 함수랑 충돌해 비동기적 실행을 할 수가 없었습니다. 한번만 askopenfilename
이 실행되는게 아니고 무한실행해요.
- 아직 class 함수도 아직 잘 모르는 상태에요. 도와주세요 고수여러분...
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
2 답변
-
fileopen
함수가askopenfilename
으로 받아온filepath
를return
하고 있지 않아요. 함수 마지막에return filepath
를 추가해야 할 겁니다.글로번변수가 왜 필요한지 모르겠습니다.
from p1 import fileopen def myfunction(): path = fileopen() # path 를 가지고 파일을 읽든 뭘하든 가지고 논다.
다른 파일에서
import p2
하고,p2.a
를 사용한다는 말인가요?p2.py
의 루트네임스페이스에a
라는 변수가 정의되어 있어야 합니다.글로벌변수 그닥 좋지 않아요. 글로벌변수를 쓰지 않는 방식으로 코딩하는 습관이 좋습니다.
질문을 할 때에는, 질문의 요지를 명확하게 해 주세요. 내가 모르는 게 무엇인지 좁혀과는 과정에서 문제가 해결되는 경우도 많을 겁니다. 그리고, 질문할 때에는 문제가 재현되는 최소한의 코드를 만들어 보세요. 내가 무얼 모르는지 모르는 상태에서는 질문을 해도, 좋은답변을 받기도 어렵습니다.
-
글로벌 변수로 접근하는 방법도 있겠지만 static 한 변수로 접근하는 방법도 있습니다.
자바나 c#에서 static 키워드와 유사한 동작을 합니다.
- p1.py
class StaticVars: myVar = 0 # 일종의 static 변수같이 사용됩니다. 사실 파이썬에서 변수는 dict 으로 관리가 되고 있습니다. 이것은 vm내에서 유일합니다. StaticVars.myVar = 1 # 1로 설정
- p2.py
import p1 print(p1.StaticVars.myVar) # 1이 출력됩니다.
댓글 입력