파이썬 패키지 관리 및 실행 환경

간단한 테스트 코드를 작성하는 것이 아니라면 가급적 SW 구조 및 모듈화를 생각하면서 코딩하려고 한다. 파이썬 역시 소스 코드를 모듈화하기 위한 방법으로 패키지를 사용한다.

 

패키지 관계 및 module path를 설명하기 위해 아래와 같은 패키지 구조를 만들어 테스트 하였으며, main.py 파일이 실행 시작 위치이다.

극단적인 구조를 만들기 위해 아래와 같이 모듈간 서로 꼬리를 물며 다른 모듈의 클래스를 생성하고 있다.

src 디렉토리에서 main.py 파일을 실행하는데에는 전혀 문제가 되지 않지만, 각 모듈을 검증하기 위해 서브 디렉토리에서 a_module.py, b_module.py 등을 실행하면 모듈을 찾을 수 없다는 에외가 발생한다. 파이썬의 패키지나 모듈을 검색하는 순서는 아래 글을 참고하면 쉽게 이해할 수 있다.

 

파이썬 - import가 module과 package 를 찾아가는 경로

파이썬에서는 import를 활용해 현재 작성하고 있는 파일 바깥의 패키지 및 모듈을 불러와 그 안에 있는 요소들을 가져다 쓸 수 있는데요, 이때 파이썬이 어떻게 패키지와 모듈이 있는 곳을 찾아나

velog.io

파이썬에서 모듈을 검색은 sys.modules -> built-in modules -> sys.path 순서로 진행되며, 여기서 모듈을 찾을수 없다면 예외가 발생한다. 참고로 파이썬 실행 위치는 sys.path 기본적으로 포함된다.

 

따라서, src 디렉토리에서 main.py 실행은 sys.path에 ~/TestPackages/src 디렉토리가 기본적으로 포함되어 문제 없이 실행된 반면, ~/TestPackages/src/a_pack 디렉토리에서 a_modules.py 실행시 b_pack을 찾을 수 없어 예외가 발생한 것이다. 이것을 해결하기 위해 PYTHONPATH 환경변수에 ~/TestPackages/src 디렉토리를 등록하여 어느 패키지든 a_pack, b_pack을 참조할 수 있도록 한다.

$ export PYTHONPATH=$PYTHONPATH;~/TestPacages/src;

위와 유사하게 C언어도 빌드할 때 include path를 설정하여 특정 라이브러리를 어디서든 사용할 수 있게 한 것과 같다. 그리고, 아래와 같이 a_pack 또는 b_pack을 import 하기 전에 sys.path에 ~/TestPackages/src 디렉토리를 추가하는 방법 있다.

import os
import sys

sys.path.append(os.path.abspath('~/TestPacages/src'))

from b_pack.b_subpack.c_module import *
...

import할 패키지 전에 sys.path에 module path를 지정해야 하는 것을 명심해야 한다. 이 방법은 검증이 완료되면 sys.path.append() 부분을 반드시 삭제해야 하기 때문에 권장하지는 않을 것 같다.

 

Visual Studio Code를 사용하면, 위와 일련의 작업을 한번에 해결 할 수 있다. Visual Studio Code는 프로젝트 단위로 실행 환경을 설정이 가능하다. 실행 환경 설정은 명령모드에서 debug launch.json을 선택하면 아래와 같은 json 파일이 생성될 것이다.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]

위  json 파일은 현재 파일을 실행할 때 필요한 정보를 나타내며, 위의 값은 기본 값이다. 위 파일에 아래와 같이 env 값에 PYTHONPATH를 추가할 수 있다.

        ...
            "console": "integratedTerminal"
            "env": {
                "PYTHONPATH": "${workspaceFolder}/src"
            }
        ...

launch.json 파일에 env를 추가하면, a_module.AA가 실행될 때 참조하는 패키지(모듈) 경로가 설정되기 때문에 sys.path.append() 없이 a_module을 사용할 수 있는 것을 확인할 수 있다.

 

Visual Studio Code에서 ctrl + F5을 사용하여 파이썬 개별 파일(모듈)을 실행(디버그 모드)하는 것이 아니라 shift + ctrl + B을 프로젝트 단위의 프로그램을 실행하는 환경도 launch.json 파일과 같이 tasks.json 파일로 설정이 가능이 한다.

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Python Run",
            "type": "shell",
            "command": "python3",
            "args": [
                "${workspaceFolder}/src/main.py"
            ],
            "options": {
                "env": {
                    "PYTHONIOENCODING": "UTF-8"
                }
            },
            "group": {
                "kind": "test",
                "isDefault": true
            },
            "problemMatcher": []
        }
    ],
    
}

파이썬 실행환경은 아래 글을 참고하여 생성한 것이며, 여기서 중요한 것은 프로젝트 단위의 프로그램을 시작 파일을 지정하는 것이다. 위 내용에서는 ${worksparceFolder}/src/main.py으로 설정한 것을 확인할 수 있으며, vscode에서 shift + ctrl + B로 실행할 경우 main.py가 실행된다.

 

 

VSCode 소개와 언어 별 기본 tasks.json 모음

초보자를 위한 VSCode 간략한 소개와 Python, Javascript, Ruby, Go 언어 별 기본 실행 tasks.json 예시 모음 1. 비주얼 스튜디오 코드 소개 Visual Studio Code https://code.visualstudio.com/ Visual Studio Co..

sosomemo.tistory.com