워크플로우: 패키지와 환경 (Workflow: Packages and Environments)

이 장에서는 패키지와 패키지를 설치하는 방법, 그리고 패키지를 격리하여 프로젝트를 재현 가능하게 유지해 주는 가상 코딩 환경에 대해 배울 것입니다.

패키지 (Packages)

서론

패키지(라이브러리라고도 함)는 파이썬의 기능을 확장하는 핵심입니다. 머지않아 패키지를 설치해야 할 일이 생길 것입니다. 지학, 웹사이트 구축, 유전자 데이터 분석, 경제학 등 상상할 수 있는 거의 모든 분야를 위한 패키지들이 있습니다. 패키지는 대개 파이썬 언어의 핵심 유지관리자들이 아니라 열성적인 개인, 기업, 연구자, 학자 등 다양한 사람들에 의해 작성됩니다! 누구나 패키지를 작성할 수 있기 때문에 품질과 유용성은 천차만별입니다. 하지만 반복해서 보게 될 아주 유명한 패키지들이 몇 가지 있습니다.

각각 수치 계산, 데이터 분석, 플로팅 기능을 제공하는 numpy, pandas, matplotlib라는 세 가지 파이썬 패키지는 어디에나 존재합니다. 위 트윗에서처럼 수많은 스크립트가 이 세 패키지를 임포트하는 것으로 시작합니다!

새로운 파이썬 패키지를 사용하는 데는 대개 두 단계가 필요합니다:

  1. 명령줄(터미널)에서 패키지를 설치합니다. 예: pixi add pandas

  2. 파이썬 세션에서 패키지를 임포트(가져오기)합니다. 예: import pandas as pd

특정 패키지에 대한 설치 명령을 내리면, 인터넷에서 자동으로 다운로드되어 여러분의 컴퓨터 적절한 위치에 설치됩니다. 추가적인 파이썬 패키지를 설치하려면 “터미널”이라고 불리는 텍스트 기반 창에 설치 명령을 입력합니다.

명령줄 요약 (The Command Line in Brief)

터미널(terminal) 또는 명령줄(command line), 또는 가끔 명령 프롬프트(command prompt)라고 불리는 곳은 첫 단계 (First Steps) 장의 Visual Studio Code 스크린샷에서 4번으로 표시되었습니다. 터미널은 (파이썬 명령뿐만 아니라) 여러분의 컴퓨터에 온갖 종류의 명령을 내리는 텍스트 기반 방법입니다. 패키지 관리, 환경(아직 논의하지 않았습니다), 버전 관리(마찬가지입니다) 등이 모두 터미널을 통해 수행될 수 있기 때문에 명령줄에 대해 조금 아는 것은 코딩(및 그 이상)에서 정말 유용합니다. 이에 대해서는 명령줄 (The Command Line) 장에서 자세히 다루겠지만, 지금은 터미널이 무엇이고 무엇을 하는지 배경지식을 조금 알아보겠습니다.

Visual Studio Code 내에서 명령줄을 열려면, <kbd>⌃</kbd> + <kbd>\`</kbd> 단축키(맥) 또는 <kbd>ctrl</kbd> + <kbd>\`</kbd>(윈도우/리눅스)를 사용하거나 "View > Terminal"을 클릭하세요.

Visual Studio Code와 별개로 명령줄을 열고 싶다면, 맥과 리눅스에서는 "Terminal"을, 윈도우에서는 "Powershell"을 검색해 보세요.

첫째, 여러분의 컴퓨터에서 아이콘을 클릭하여 프로그램을 실행할 수 있는 모든 작업은 명령줄(또는 터미널)을 통해서도 할 수 있습니다. 많은 프로그램의 기능을 명령줄에서 접근할 수 있으며, 일부 프로그램은 데이터 과학에 사용되는 것들을 포함하여 명령줄 인터페이스(CLI)만 가지고 있기도 합니다.

명령줄은 운영 체제와 상호 작용하며, 파이썬 설치본을 생성, 활성화 또는 변경하는 데 사용됩니다.

Visual Studio Code 창의 맨 위 명령 목록에서 Terminal -> New Terminal을 클릭하여 터미널 창을 여세요. 여러분의 컴퓨터에 pixi가 설치되어 있다면, ’명령 프롬프트’는 다음과 같이 보일 것입니다:

사용자이름@컴퓨터이름 현재-디렉토리 %

맥의 경우이며, 리눅스에서는 ‘%’ 대신 ’$’가 보일 것입니다. 윈도우(Powershell 사용 시)의 경우:

PS C:\Windows\System32>

다음 명령을 실행하여 pixi가 현재 프로젝트 폴더에 파이썬을 성공적으로 설치했는지 확인할 수 있습니다.

pixi run python --version

우선 명령줄을 한 번 시도해 보기 위해, 세 가지 주요 운영 체제 모두에서 작동하는 명령을 써보겠습니다. 새 터미널 창에 나타난 명령 프롬프트에 pixi run python을 입력하세요. 파이썬 버전을 포함하여 설치된 파이썬 정보가 나타나고, 그 뒤에 >>> 모양의 파이썬 프롬프트가 보일 것입니다. 이것은 터미널에서 실행되는 일종의 대화형 파이썬 세션입니다. Visual Studio Code에서 제공하는 것보다는 훨씬 기능이 적지만(예를 들어 스크립트를 한 줄씩 실행할 수는 없습니다), print('Hello World!')를 입력하면 여러분의 메시지가 출력되는 것을 확인할 수 있습니다. 터미널 기반 파이썬 세션을 종료하려면 exit()를 입력하여 일반 명령줄로 돌아가세요.

패키지 설치하기

추가 파이썬 패키지를 설치하는 가장 기본적이고 쉬운 방법은 pixi add **패키지이름**을 사용하는 것입니다. PyPI(파이썬 패키지 인덱스)에는 330,000개가 넘는 파이썬 패키지가 있습니다! 명령줄에 pixi list를 입력하여 이미 설치된 패키지들을 볼 수 있습니다.

pixi add ...는 현재 폴더 내의 특별한 파이썬 환경에 패키지를 설치합니다(이 환경은 대부분의 시스템에서 기본적으로 숨겨져 있는 “.pixi”라는 하위 디렉토리에 위치합니다). 프로젝트마다 하나의 독립된 파이썬 환경을 갖는 것은 매우 유익하고 좋은 관행이며, pixi가 이를 자동으로 처리해 줍니다.

`pixi add`를 사용하여 **matplotlib**, **pandas**, **statsmodels**, **skimpy** 패키지를 설치해 보세요.

패키지 사용하기

패키지를 설치했다면, 이를 사용할 수 있어야 합니다! 이는 대개 스크립트나 주피터 노트북 최상단에 임포트(import) 문을 써서 수행합니다. 예를 들어, pandas를 가져오려면 다음과 같이 합니다.

코드 보기
import pandas as pd

왜 파이썬은 이런 방식을 사용할까요? 모든 패키지를 한꺼번에 로드하지 않는 이유는 어떤 패키지의 어떤 함수가 호출되고 있는지 명확히 하기 위해서입니다. 또한 모든 분석 작업에 모든 패키지를 로드할 필요는 없으며, 종종 분석을 재현하기 위해 필요한 최소한의 패키지 세트가 무엇인지 알고 싶을 때가 있습니다. 패키지 임포트를 명시적으로 하는 것은 이 모든 과정에 도움이 됩니다.

왜 단순히 import pandas as pandas라고 하지 않는지 궁금할 수도 있습니다. 사실 그렇게 해도 상관없지만, i) 더 짧은 이름을 사용하는 것이 편리하고 ii) 임포트 관례가 존재하기 때문입니다. 즉, pandaspd, numpynp로 사용하는 것이 본인과 다른 사람들에게 코드를 더 명확하게 전달하는 방법이며 관례를 따르는 것이 좋습니다.

가상 코딩 환경 (Virtual Code Environments)

가상 코딩 환경은 특정 프로젝트의 분석을 위해 사용하는 모든 패키지를 다른 프로젝트에서 필요할 수 있는 패키지 세트와 격리할 수 있게 해줍니다. 이는 재현 가능한 분석 파이프라인을 만드는 데 중요한 부분입니다. 핵심적인 이점은 다른 사람이 여러분이 사용한 환경을 그대로 재현할 수 있다는 것이며, 프로젝트마다 독립된 환경을 갖는 것이 모범 사례입니다.

더 구체적인 예를 들어보겠습니다. 프로젝트 A를 위해 파이썬 3.9, statsmodels, pandas를 사용하고 있다고 합시다. 그리고 프로젝트 B를 위해서는 numpyscikit-learn이 포함된 파이썬 3.10을 사용해야 합니다. 비록 파이썬 버전이 같더라도, 프로젝트 A에 필요한 모든 것이 담긴 환경 A와 프로젝트 B를 위한 환경 B라는 두 개의 별도 가상 파이썬 환경을 갖는 것이 모범 사례입니다. 서로 다른 파이썬 버전을 사용하는 경우에는 이는 선택이 아닌 필수입니다.

이제 많은 프로그래밍 언어들이 격리된 환경에 언어 버전과 패키지들을 설치할 수 있는 옵션을 제공합니다. 파이썬에는 서로 다른 환경을 관리하기 위한 여러 도구들이 있습니다. 그중에서도 가장 다루기 쉬운 도구는 아마도 pixi일 것입니다.

명령줄에서 pixi list를 실행하여 현재 폴더에 생성된 환경의 모든 패키지를 볼 수 있습니다. 다음은 이 책 자체의 프로젝트 내에서 설치된 패키지들 중 “s”로 시작하는 것들만 필터링하여 확인하는 예제입니다.

pixi list | grep ^s

파이썬 환경의 pyproject.toml 파일

pyproject.toml이라는 파일이 생성된 것을 눈치채셨을 수도 있습니다.

코드 보기
import toml
from rich import print_json
from pathlib import Path

# Find project root by looking for pyproject.toml upwards
def find_pyproject(start_path):
    for path in [start_path] + list(start_path.parents):
        if (path / "pyproject.toml").exists():
            return path / "pyproject.toml"
    return None

pyproject_path = find_pyproject(Path.cwd())

if pyproject_path:
    with open(pyproject_path, "r", encoding="utf-8") as f:
        config = toml.load(f)
    print_json(data=config)
else:
    print("pyproject.toml not found")
{
  "project": {
    "name": "python4ds",
    "version": "1.0.4",
    "description": "The online book that teaches you how to use Python for data science.",
    "readme": "README.md",
    "requires-python": ">=3.10.0",
    "dependencies": [
      "beautifulsoup4>=4.12.3",
      "ghp-import>=2.1.0",
      "graphviz>=0.20.3",
      "ibis-framework[sqlite]>=9.5.0",
      "ipykernel>=6.29.5",
      "jupyter>=1.1.1",
      "jupyterlab>=4.3.4",
      "lets-plot==4.5.2",
      "nbclient>=0.10.2",
      "nbstripout>=0.8.1",
      "numpy>=2.2.1",
      "openpyxl>=3.1.5",
      "palmerpenguins>=0.1.4",
      "pandas>=2.2.3",
      "pandas-datareader>=0.10.0",
      "pandas-profiling>=3.2.0",
      "pandasdmx>=1.10.0",
      "pip>=24.3.1",
      "polars>=1.19.0",
      "pre-commit>=4.0.1",
      "pytest>=8.3.4",
      "pyyaml>=6.0.2",
      "rich>=13.9.4",
      "scipy>=1.15.0",
      "skimpy>=0.0.17",
      "sqlalchemy>=1.4.39",
      "sqlmodel>=0.0.22",
      "statsmodels>=0.14.4",
      "toml>=0.10.2",
      "watermark>=2.5.0"
    ]
  },
  "tool": {
    "ruff": {
      "lint": {
        "ignore": [
          "F405",
          "F403"
        ]
      }
    },
    "pixi": {
      "workspace": {
        "channels": [
          "conda-forge"
        ],
        "platforms": [
          "osx-arm64",
          "linux-64"
        ]
      },
      "pypi-dependencies": {
        "python4ds": {
          "path": ".",
          "editable": true
        }
      },
      "tasks": {
        "render": "quarto render mybook",
        "install": "pixi install",
        "pre-commit": "pre-commit run --all-files",
        "ghp-import": "ghp-import -n -p -f mybook/_book"
      },
      "dependencies": {
        "python": "3.10.*",
        "quarto": ">=1.8.27,<2"
      }
    }
  }
}

이 파일은 pixi 파이썬 프로젝트의 모든 의존성 패키지와 버전을 나열합니다. 사용 중인 패키지 버전을 이렇게 추적하는 것에는 많은 이점이 있습니다. 가장 중요한 것 중 하나는 프로젝트를 다른 사람과 공유할 수 있고, 그들도 이 파일들로부터 환경을 그대로 설치할 수 있다는 점입니다.

패키지를 설치하거나 제거함에 따라, pyproject.toml 파일도 그에 맞춰 변경됩니다.

Visual Studio Code에서 파이썬 스크립트나 주피터 노트북을 열면 현재 사용 중인 파이썬 환경이 표시됩니다.

Visual Studio Code의 전형적인 사용자 뷰

위 스크린샷에서 프로젝트 환경을 두 곳에서 확인할 수 있습니다: 화면 하단의 파란색 바와, 대화형 창(5번)의 오른쪽 상단입니다. 주피터 노트북을 열었을 때도 오른쪽 상단에 비슷한 표시가 나타납니다.