Python을 이용해서 개발을 하다보면 간혹 상위 폴더나 다른 위치에 있는 라이브러리를 사용해야 할 경우가 있다. 이때, 그냥 import를 하면 다음과 같은 오류를 볼 수 있다.
ModuleNotFoundError: No module named 'my_module'
Python은 실행을 위한 라이브러리를 사전에 지정된 위치에서 탐색하는데 이는
import sys
for i in sys.path:
print(i)
#/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python311.zip
#/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11
#/opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/lib-dynload
#/Users/shinhyeonjun/.local/share/virtualenvs/yolov3_pytorch-H6exmCHA/lib/python3.11/site-packages
#/opt/homebrew/opt/python-tk@3.11/libexec
와 같은 방법으로 확인할 수 있다. 현재 실행파일이 위치한 디렉터리를 제외하고 여기에 있는 디렉터리들을 탐색하여 라리브러리를 찾기 때문에 우리가 만든 임의의 라이브러리를 그냥 불러올 수 없는 것이다.
해결 방법은 간단한다.
먼저, 코드상에서 추가하는 방법이다.
import sys
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
와 같이 간단하게 디렉터리를 추가할 수 있다.
다만, 이 방법은 코드를 공유하거나 잠깐만 사용하는 경우에 많이 귀찮을 수 있다.
VScode에서는 이러한 불편을 해소할 수 있도록 launch.json, setting.json 파일을 통해 이런 종류의 문제를 조작할 수 있다.
저의 경우에는 Run Code 혹은 Debug: Start Without Debugging 을 통해 Python 파일을 실행합니다.

해당 경로에 두 파일을 이용해서 각 실행 방법에 대한 환경 변수를 지정할 수 있다.

를 이용하는 경우에는 setting.json 파일에 다음과 같은 내용을 넣어주면 된다. 다른 os를 사용하는 경우에 osx 부분을 window나 linux로 바꿔주면 된다.
{
"terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceRoot}/src/"}
}

를 이용하는 경우에는 launch.json 파일에 다음과 같은 내용을 넣어주면 된다. 여기서 핵심은 env에 PYTHONPATH이 부분이다.
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
// "program": "${workspaceFolder}/src/train.py",
"console": "integratedTerminal",
"justMyCode": true,
"cwd": "${workspaceFolder}",
"env": {"PYTHONPATH": "${workspaceRoot}/src/"}
}
]
}
이상이다.