티스토리 뷰
가상환경 site-packages에 설치된 라이브러리 수정해서 사용하는 방법
몇 년 전, 팀원들과 함께 파일럿으로 구현한 Python 기반 서비스를 다른 서버로 이관하는 과정에서 예상치 못한 문제가 발생했습니다. 가상환경의 site-packages에 설치된 라이브러리의 .py 파일을 직접 수정한 상태였고, 이 상태로 requirements.txt를 이용해 새로운 서버에 라이브러리를 설치하자, 동일한 환경임에도 오류가 발생한 것입니다. 이 경험을 통해 깨달은 것은, 설치된 라이브러리를 직접 수정하는 방식은 이식성과 유지보수 측면에서 매우 취약하다는 점이었습니다.
실제로 프로젝트를 진행하다 보면 외부 라이브러리의 기능이 100% 만족스럽지 않아, 약간의 수정을 가하고 싶을 때가 있습니다. 하지만 site-packages 내 코드를 직접 수정하는 방식은 위험할 뿐만 아니라, 향후 업데이트나 서버 이전 시에도 문제가 발생할 수 있습니다. 이럴 때는, 상속을 통해 원하는 기능만 안전하게 덮어씌우는 방식이 훨씬 더 효과적이고 유지보수에도 유리합니다.
🔍 1. 라이브러리 소스 코드 위치 확인하기
우선 수정하고 싶은 클래스나 함수가 어디 정의되어 있는지 찾아야 합니다.
# 예시: pandas 설치 경로 찾기
python -c "import pandas; print(pandas.__file__)"
/path/to/venv/lib/python3.x/site-packages/pandas/__init__.py
이 경로를 통해 실제 코드를 열어보면서 어떤 클래스를 상속받을지 파악합니다.
🧬 2. 원하는 클래스를 상속하기
예를 들어 SomeLibrary라는 라이브러리에 있는 SomeClass의 기능 중 greet() 메서드만 바꾸고 싶다고 가정합니다.
# 원본 라이브러리 코드 예시
class SomeClass:
def greet(self):
print("Hello from the original class!")
이 클래스를 상속해서 원하는 부분만 바꿔보겠습니다.
✍️ 3. 사용자 정의 클래스 작성하기
# my_custom_module.py
from some_library import SomeClass
class MyCustomClass(SomeClass):
def greet(self):
print("Hello from my customized class!")
이제 기존 코드 대신 MyCustomClass를 사용하면 됩니다.
# main.py
from my_custom_module import MyCustomClass
obj = MyCustomClass()
obj.greet() # 출력: Hello from my customized class!
🗂️ 4. 많이 수정할 땐 전체 복사하여 수정
라이브러리를 크게 수정해야 한다면, 해당 디렉토리를 통째로 복사해서 프로젝트 내 디렉토리에 넣고 사용하는 방법도 있습니다.
#라이브러리 복사
cp -r venv/lib/python3.x/site-packages/some_library/ your_project/custom_lib/
그리고 PYTHONPATH나 sys.path를 이용해 이 디렉토리를 우선적으로 참조하도록 설정합니다.
1) VSCode 등 IDE에서 PYTHONPATH 설정
.env 파일 또는 런타임 설정에 다음 추가:
PYTHONPATH=/your_project/custom_lib
2) sys.path로 코드에서 직접 지정
스크립트 또는 main.py 맨 위에 다음과 같이 명시적으로 경로를 추가합니다:
import sys import os sys.path.insert(0, os.path.abspath("custom_libs")) # 프로젝트 루트 기준 상대경로
⚠️ 정리 및 고려사항
항목 | 설명 |
❌ 직접 수정 | site-packages를 직접 수정하면 업데이트 시 덮어씌워짐 |
✅ 상속 방식 | 필요한 기능만 오버라이딩하는 것이 안전하고 명확 |
❗ C-extension 주의 | Pandas, NumPy처럼 C 기반 라이브러리는 상속이나 수정이 어려움 |
✅ 마무리
라이브러리를 상속해서 커스터마이징하는 방법은 Python의 강력한 객체지향 기능을 잘 활용하는 대표적인 방식입니다.
회고를 위해 간단한 예시로 포스팅을 작성하였고 이후에는 실전 코드기반의 예시를 작성해 볼 예정입니다.
'IT Lab > Devopment' 카테고리의 다른 글
[Java] WAR 와 JAR 배포 비교 (0) | 2025.05.31 |
---|
- Total
- Today
- Yesterday
- sqlserver
- rockylinux
- data lineage
- PostgreSQL
- 데이터 리니지
- jar
- ChatGPT
- vscode
- AI코딩
- 챗gpt
- springboot
- cursorai
- 테이블복사
- venv
- DB
- gpt활용
- 데이터플랫폼
- sql
- backend
- DBeaver
- AX
- db운영
- java배포
- k8s
- 데이터리니지
- 가상환경
- mssql
- Kubernetes
- datahub
- DATABASE
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |