0. 학습 목표

더보기

이번 학습에서는 프로그램이 단순히 코드만으로 실행되는 것이 아니라,

프로그래밍 언어의 버전, 라이브러리 버전, 운영체제, 설치 방식, 실행 환경의 영향을 받는다는 점을 이해합니다.

 

이를 통해 개발 환경과 호환성이 실제 프로그램 실행에 어떤 영향을 주는지 살펴보고,

Python 개발에서 가상환경과 패키지 버전 관리가 필요한 이유를 학습합니다.

1. 문제상황 예시와 해결책

2. 익숙한 파일 세계에서 보는 호환성

더보기

2.1. Word 파일 예시

프로그래밍 환경의 호환성을 이해하기 전에, 먼저 우리가 익숙하게 사용하는 문서 파일을 떠올려 보겠습니다.

예를 들어 Word 2010에서 만든 .docx 파일을 Word 2019나 Word 365에서 열면 어떻게 될까요?

대부분의 경우 큰 문제 없이 열립니다. 글자, 표, 기본 서식은 대체로 유지됩니다.

이유
Word는 과거에 만든 문서를 최신 버전에서도 열 수 있도록 하위 호환성을 유지하는 방향으로 발전해 왔기 때문입니다.

 

 

 

 

2.2. PowerPoint · Excel 실행 기능 포함 문서 예시

PowerPoint 문서에는 애니메이션이 들어갈 수 있고, Excel 문서에는 매크로가 들어갈 수 있습니다.

예를 들어 다음과 같은 경우를 생각해 볼 수 있습니다.

  • PowerPoint 2013에서 만든 .pptx 파일을 PowerPoint 365에서 열기
  • Excel 2016에서 만든 .xlsm 파일을 Excel 365에서 열기

파일 자체는 열릴 수 있습니다. 하지만 애니메이션, 매크로, 외부 연결, 보안 설정과 관련된 기능은 환경에 따라 다르게 동작하거나 차단될 수 있습니다. 이를 호환성 문제라고 합니다.

요소 설명
문서 파일 글자, 표, 슬라이드, 수식 등
실행 기능 애니메이션, 매크로, 자동화 기능
실행 환경 프로그램 버전, 보안 정책, OS 설정

프로그래밍과의 연결
워드와 파워포인트, 엑셀의 예시처럼, 프로그래밍 소스 코드는 존재한다고 해서 항상 실행되는 것은 아닙니다.

소스코드가 실행되려면 그 코드에 맞는 언어 버전, 라이브러리, OS, 설정이 함께 맞아야 합니다.

3. 일반적인 프로그래밍 언어의 호환성

더보기

3.1. 많은 프로그래밍 언어는 하위 호환성을 중요하게 다룬다

C, C++, C#, Java 같은 언어는 일반적으로 기존 코드를 오래 유지할 수 있도록 설계되는 편입니다.

물론 모든 상황에서 100% 호환된다는 뜻은 아닙니다.

컴파일러 옵션, 표준 버전, 라이브러리, 실행 환경에 따라 차이가 생길 수 있지만, 하위 호환되도록 발전해왔습니다.

기본 방향
과거에 작성한 코드가 최신 환경에서도 최대한 계속 동작하도록 유지하는 것을 중요하게 생각합니다.

 

3.2. C / C++ 예시

// C99 예시
#include <stdio.h>

int main() {
    int x = 10;
    printf("%d\n", x);
    return 0;
}

이 코드는 C99 기준(1999년)으로 작성된 간단한 C 코드입니다. 

대부분의 경우 C11, C17 같은 이후 표준 환경에서도 큰 문제 없이 컴파일되고 실행됩니다.

 

3.3. C# 예시

// C# 2.0 스타일 예시
using System;

class Program {
    static int Add(int a, int b) {
        return a + b;
    }

    static void Main() {
        Console.WriteLine(Add(3, 5));
    }
}

이 코드는 오래된 C# 문법 스타일로 작성된 코드입니다.

최신 C# 환경에서도 대부분 그대로 컴파일됩니다. C#과 .NET은 기존 코드와의 호환성을 중요하게 다루기 때문입니다.

 

3.4. Java 예시

// Java 8 스타일 예시
public class Main {
    static int add(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        System.out.println(add(3, 5));
    }
}

Java 역시 하위 호환성을 매우 중요하게 다루는 언어입니다.

Java 8에서 작성한 기본 코드는 Java 17, Java 21 같은 최신 환경에서도 대부분 그대로 컴파일되거나 실행될 수 있습니다.

4. Python 버전 정책과 호환성

더보기

4.1. Python은 왜 환경 관리가 특히 중요한가?

Python도 하위 호환성을 고려합니다.

하지만 실제 Python 개발에서는 단순히 Python 문법만 보는 것이 아니라, 여러 요소가 함께 맞아야 합니다.

요소 예시
Python 버전 Python 3.8, 3.10, 3.11, 3.12
패키지 버전 NumPy, pandas, PySide6, PyTorch 등
OS 환경 Windows, Ubuntu, macOS
설치 방식 apt, pip, conda, venv
실행 위치 전역 Python, 가상환경 Python

자주 발생하는 문제
코드는 맞는데, 내 컴퓨터에서는 실행되고 다른 컴퓨터에서는 실행되지 않는 경우가 있습니다.

이 문제는 대부분 Python 버전과 패키지 조합이 다르기 때문에 발생합니다.

 

4.2. Python은 서드파티 패키지 의존도가 높다

Python 개발은 외부 라이브러리를 많이 사용하는 방식으로 이루어지는 경우가 많습니다.

  • NumPy
  • pandas
  • matplotlib
  • PySide6
  • PyTorch
  • TensorFlow
  • FastAPI
  • Django

문제는 새 버전 Python이 나왔다고 해서 모든 패키지가 즉시 그 버전을 지원하는 것은 아니라는 점입니다.

상황 결과
Python은 최신 버전으로 설치됨 일부 패키지가 아직 지원하지 않을 수 있음
패키지는 설치되지만 wheel이 없음 빌드 오류가 발생할 수 있음
최신 패키지를 설치함 오래된 Python 버전을 더 이상 지원하지 않을 수 있음
기존 코드에서 쓰던 함수가 제거됨 실행 중 에러가 발생할 수 있음

5. Python 호환성 문제

더보기

5.1. 표준 라이브러리 함수 삭제 예시

import time

start = time.clock()

# ... some work ...

end = time.clock()

표준 라이브러리는 말 그대로, 표준, 즉 하나의 기준으로 변경되면 안됩니다.

하지만 위 코드 `time.clock()`은 과거에 실행 시간 측정용으로 사용되던 함수입니다.
하지만 Python 3.3부터 deprecated 되었고, Python 3.8에서 제거되었습니다. 공식 문서에서는 대신 `time.perf_counter()` 또는 `time.process_time()`을 사용하라고 안내합니다.


기존 코드 제거된 버전 대체 방법
time.clock() Python 3.8 time.perf_counter(), time.process_time()
platform.popen() Python 3.8 os.popen()
fractions.gcd() Python 3.9 math.gcd()
base64.encodestring() Python 3.9 base64.encodebytes()
base64.decodestring() Python 3.9 base64.decodebytes()
json.loads(..., encoding=...) Python 3.9 encoding 인자 제거
HTMLParser.unescape() Python 3.9 html.unescape()

핵심
Python 버전이 바뀌면 과거에 사용하던 함수가 더 이상 존재하지 않을 수 있습니다.

문제는 몇몇 라이브러리들은 과거의 대체되기 이전 기능을 사용하고 있을 수 있다는 점입니다.

 

5.2. 외부 라이브러리 API 변경 예시

import numpy as np

x = np.int(3)
y = np.float(3.14)

과거에는 위와 같은 코드가 동작하는 경우가 많았습니다.

하지만 NumPy의 버전이 올라가면서 np.int, np.float 같은 표현은 더 이상 권장되지 않거나 제거되었습니다.

따라서 같은 코드라도 NumPy 버전에 따라 실행 결과가 달라질 수 있습니다.

핵심
문제는 작성된 소스코드에 np.int, np.float 같은 사라진 코드가 존재한다면, 

구버전 NumPy 그리고, 구버전 NumPy를 지원하는 구버전 Python 을 사용해야 합니다.

 

5.3. pandas 동작 방식 변경 예시

df = df.astype("int")

과거에는 데이터에 따라 묵시적으로 처리되던 변환이 최신 pandas 환경에서는 에러로 바뀌거나 더 엄격하게 처리될 수 있습니다.

예를 들어 결측값이 포함된 데이터, 문자열이 섞인 데이터, 변환할 수 없는 값이 있는 경우 과거와 최신 버전의 동작이 다르게 나타날 수 있습니다.

영향 요소 설명
Python 버전 문법, 표준 라이브러리, 실행 방식에 영향
pandas 버전 데이터 변환, 결측값 처리 방식에 영향
데이터 상태 문자열, 결측값, 이상값 포함 여부에 따라 결과가 달라짐
실행 환경 OS, 설치 방식, 가상환경 여부에 따라 차이 발생

6. 세번재 문제 상황: 외부 라이브러리

더보기

6.1. 파이썬 개발 환경 문제

Python 다양한 버전이 존재하며,

다양한 Python 외부 라이브러리를 많이 사용하는 언어입니다.

 

예를 들어

데이터 분석을 할 때는 NumPy, pandas를 사용하고,

GUI 프로그램을 만들 때는 PySide6를 사용할 수 있습니다.

인공지능 학습을 할 때는 PyTorch, TensorFlow 같은 라이브러리를 사용하기도 합니다.

프로젝트 필요한 환경 예시
데이터 분석 프로젝트 Python 3.10, pandas, NumPy
GUI 프로그램 프로젝트 Python 3.11, PySide6
AI 모델 학습 프로젝트 Python 3.10, PyTorch, TensorFlow

 

문제는,

Python 개발 프로젝트마다 필요한 Python 버전과 라이브러리 버전이 달라 문제가 생길 수 있습니다.

 

예를 들어,

System Python에서는 Python 3.10과 PySide6 6.5 라이브러리 버전이 설치되어 있다면

System Python 버전 (전역)
Python 3.10
PySide6 6.5

 

A 프로젝트에서는 Python 3.10과 PySide6 6.5 라이브러리 버전이 필요할 때 문제가 없습니다.

A 프로젝트
Python 3.10
PySide6 6.5

 

반면,

B 프로젝트에서는 더 최신 Python과 PySide6 6.7 같은 다른 라이브러리 버전이 필요할 수 있습니다.

 
A 프로젝트 →  B 프로젝트
Python 3.10  →  Python 3.12
PySide6 6.5  →  PySide6 6.7

 

B 프로젝트를 진행하면서 PySide6 6.7로 라이브러리를 업그레이드하거나, System Python의 버전을 변경하면
A 프로젝트가 갑자기 정상적으로 실행되지 않을 수 있습니다. 그리고 운영체제 System 자체게 문제가 발생할 수 있습니다.

 

 

 

 

6.2 가상환경(venv) 이 필요한 이유

 

해결방법은 

Python 개발에서는 프로젝트마다 독립된 실행 환경인 가상환경을 만들어 사용해

서로 다른 프로젝트들이 서로 영향을 주지 않도록 관리합니다.

System Python 환경
Python 3.10
PySide6 6.5

A 프로젝트 가상환경
Python 3.10
PySide6 6.5

B 프로젝트 가상환경
Python 3.12
PySide6 6.7

 

이렇게 하면 B 프로젝트에서 라이브러리를 업그레이드하더라도
A 프로젝트의 환경에는 영향을 주지 않습니다.

 

7. 핵심 결론

더보기

7.1. Python 개발에서 중요한 질문

Python 개발에서 중요한 것은 단순히 Python을 설치하는 것이 아닙니다.

Python은 언어 자체도 중요하지만, 실제 개발에서는 외부 라이브러리와 실행 환경의 영향을 많이 받습니다.

 

 

 

 

7.2. 가상환경

가상환경은 프로젝트마다 독립된 Python 실행 환경을 만들어주는 기능입니다.

예를 들어 A 프로젝트와 B 프로젝트가 서로 다른 패키지 버전을 사용해야 할 수 있습니다.

프로젝트 Python 버전 주요 패키지
A 프로젝트 Python 3.10 NumPy 1.23, pandas 1.5
B 프로젝트 Python 3.12 NumPy 2.x, pandas 2.x

이 두 프로젝트를 하나의 전역 환경에서 관리하면 충돌이 발생할 수 있습니다. 그래서 Python에서는 프로젝트마다 가상환경을 만들어 사용하는 것이 좋습니다.

python3 -m venv .venv
source .venv/bin/activate

 

 

 

 

7.3. 패키지 버전 기록

가상환경을 만들었다면, 그 안에 어떤 패키지를 설치했는지도 기록해야 합니다.

대표적인 방식이 requirements.txt입니다.

pip freeze > requirements.txt

이 파일에는 현재 프로젝트에서 사용 중인 패키지 목록과 버전이 기록됩니다.

다른 컴퓨터에서 같은 환경을 만들 때는 다음 명령을 사용할 수 있습니다.

pip install -r requirements.txt

 

 

 

 

7.4. 최종 정리

관리 대상 이유
Python 버전 문법, 표준 라이브러리, 실행 방식에 영향
패키지 버전 외부 라이브러리 API 변경 가능
OS 환경 설치 방식과 실행 결과 차이
가상환경 프로젝트별 독립 환경 유지
requirements.txt 실행 환경 재현 가능성 확보

최종 핵심
프로젝트마다 가상환경을 만들고,

사용한 패키지 버전을 기록하며, 실행 환경을 재현할 수 있게 관리하는 것이 Python 개발의 기본 습관입니다.