모듈 임포시 기존의 함수로 정의된 변수의 초기화 문제

조회수 1048회

문제점

NameError: name 'a' is not defined

접근과정

tkinter를 활용해 UI용으로 만든 p1.py 파일과

p1.py에서 command를 통해 실행할 파일 p2.py 파일이 있습니다.
궁극적인 목표는 p2.py 파일에서 어떤 파일의 파일 경로를 읽어내는 것입니다.

  1. 일단 p1.pytkinter.filedialog.askopenfilename를 활용하여 얻은 파일의 경로를 return하는 함수 fileopen()를 만듭니다.

    def fileopen():
        filepath = askopenfilename(parent=window, filetype=(("all files", "*.*")))
    
  2. 또, fileopen() 하여 저장할 변수인 a를 만들고 aglobal로 전역변수로서 선언 하고 p2.py 파일을 import하는 함수를 만듭니다. 이 함수는 tkinter로 만든 버튼을 클릭 시 실행되는 command로서 기능하게 됩니다.

    def c_color_rs_l():
        global a
        a=fileopen()
        print(a)
        import p2
    
  3. 이후 c_color_rs_l을 실행해보면 a에 정상적으로 filepath가 담겨있는 것을 확인가능합니다.

  4. 하지만 p2를 import하게 되면 import p2해서 a를 받아보면 불러낸 p1의 a가 정의되어 있지 않다고 합니다.

이게 실행되지 않는 이유는 제 생각에 아마도 p2에서 p1을 import할 때 [1]~[2]의 과정을 거치지 않고 import하기 때문에 a는 정의되어 있지 않은 것 같습니다.. 어떻게 고치면 좋을까여? 파이썬 고수님들...이걸로 뻥안치고 틀동안 쭉 고민하고 고쳐봤지만 잘 모르겠습니다.

접근과정2

제가 해본 또 다른 접근과정으로 p2에다 GUI 모듈인 tkinter.filedialog를 임포트 하여 askopenfilename를 실행시키게 되면 파일 경로는 잘 읽어냅니다. 그 후가 문제인데 GUI가 쓰레드 문제인가? (아직 뭐가 문제인지 정확히 몰라요.) 기존의 함수랑 충돌해 비동기적 실행을 할 수가 없었습니다. 한번만 askopenfilename이 실행되는게 아니고 무한실행해요.

  • 아직 class 함수도 아직 잘 모르는 상태에요. 도와주세요 고수여러분...

2 답변

    1. fileopen 함수가 askopenfilename 으로 받아온 filepathreturn하고 있지 않아요. 함수 마지막에 return filepath 를 추가해야 할 겁니다.
    2. 글로번변수가 왜 필요한지 모르겠습니다.

      from p1 import fileopen
      
      def myfunction():
          path = fileopen()
          # path 를 가지고 파일을 읽든 뭘하든 가지고 논다.
      
    3. 다른 파일에서 import p2 하고, p2.a 를 사용한다는 말인가요? p2.py의 루트네임스페이스에 a 라는 변수가 정의되어 있어야 합니다.

    4. 글로벌변수 그닥 좋지 않아요. 글로벌변수를 쓰지 않는 방식으로 코딩하는 습관이 좋습니다.

    5. 질문을 할 때에는, 질문의 요지를 명확하게 해 주세요. 내가 모르는 게 무엇인지 좁혀과는 과정에서 문제가 해결되는 경우도 많을 겁니다. 그리고, 질문할 때에는 문제가 재현되는 최소한의 코드를 만들어 보세요. 내가 무얼 모르는지 모르는 상태에서는 질문을 해도, 좋은답변을 받기도 어렵습니다.

  • 글로벌 변수로 접근하는 방법도 있겠지만 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이 출력됩니다.
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)