[Python] subprocess.run과 os.system을 왜 구분해서 써야 하는지

프로세스 생성과 보안

구체적으로는 이런 상황이에요. Python으로 데이터를 다룰 때 자주 쓰는 패턴인데, 매번 문서를 찾아보게 되더라고요. 그래서 오늘은 subprocess.run과 os.system을 왜 구분해서 써야 하는지에 대해 정리해보려고 합니다.


1. 접근 방식

먼저 전체적인 그림을 보고, 구체적인 코드로 넘어가는 게 좋아요.

  1. 파이썬 내장 함수를 최대한 활용합니다.
  2. 가독성 좋은 한 줄 코드를 목표로 합니다.
  3. 실무에서 바로 쓸 수 있는 예제를 중심으로 합니다.
  4. 이 접근 방식은 subprocess.run과 os.system을 왜 구분해서 써야 하는지 관련 문제를 해결할 때 항상 기본으로 돌아가는 원칙이에요. 처음부터 복잡한 걸 시도하기보다는 기본 패턴을 확실히 이해하고 적용하는 게 중요합니다.

    사실 많은 개발자가 이 단계를 건너뛰고 바로 코드부터 쓰기 시작하는데, 그러면 나중에 유지보수할 때 고통스러워지는 경우가 많아요. 처음에 5분만 투자해서 구조를 잡아두면, 나중에 5시간을 아낄 수 있어요. 특히 팀 프로젝트에서는 이 접근 방식이 코드 리뷰 시간도 확 줄여줍니다.


    2. 코드 예제

    가장 기본적인 예제부터 시작해볼게요.

    import pandas as pd
    
    # 데이터 정제 예제
    df = pd.read_csv("data.csv")
    df = df.dropna(subset=["important_col"])
    df["new_col"] = df["old_col"].str.strip().str.lower()
    print(f"정제 후: {len(df)} rows")

    결측치를 제거하고 문자열을 정규화하는 기본 패턴입니다.

    위 코드에서 핵심이 되는 부분을 하나씩 뜯어보면 이해가 더 빨라요. 입력 데이터가 어떻게 변환되는지, 각 단계에서 어떤 일이 일어나는지 직접 print()를 찍어가면서 확인해보세요. 이 과정이 실력 향상의 핵심이에요.

    다른 방식으로 하면?

    같은 목적으로 다른 방법을 쓸 수도 있어요. 비교해보면:

    # 리스트 컴프리헨션으로 한 줄에 처리
    import csv
    
    with open("data.csv") as f:
        reader = csv.DictReader(f)
        cleaned = [
            {**row, "name": row["name"].strip().lower()}
            for row in reader
            if row.get("important_col")
        ]
    print(f"정제 후: {len(cleaned)} rows")

    pandas가 무겁게 느껴진다면, csv 모듈 + 리스트 컴프리헨션으로 같은 작업을 할 수 있어요. 작은 데이터셋에서는 오히려 더 빠를 수 있습니다.

    pandas vs csv 모듈 비교

    특성pandascsv 모듈
    대용량 처리chunksize 옵션 활용 가능메모리 주의 필요
    가독성메소드 체이닝으로 직관적딕셔너리 조작 필요
    의존성별도 설치 필요표준 라이브러리
    속도최적화된 C 엔진순수 Python

    3. 실전 팁

    실제 프로젝트에서 적용할 때 알아두면 좋은 것들이에요.

    1. pd.read_csv()에 dtype을 미리 지정하면 메모리를 아낄 수 있습니다.

    2. 체이닝할 때는 각 단계 결과를 확인하세요.

    3. 큰 데이터셋에서는 chunksize 옵션을 활용하세요.

    흔한 실수들

    초보자나 경험자나 자주 하는 실수들이 있어요.

    • dtype 지정 없이 읽으면 메모리 낭비
    • 체이닝 중간에 print() 안 하면 디버깅 어려움
    • 인덱스 리셋을 잊으면 병합 시 문제 발생

    이럴 때는 다른 방법을 쓰세요

    항상 이 방법이 최선은 아니에요.

    • 1MB 미만의 작은 파일은 csv 모듈로 충분
    • 실시간 스트리밍 데이터는 asyncio + aiofiles 고려
    • 복잡한 데이터 변환은 별도 ETL 파이프라인 분리

    다음 단계

    여기까지 subprocess.run과 os.system을 왜 구분해서 써야 하는지의 기본을 정리했어요. 이제 이걸 기반으로 한 단계 더 나아갈 수 있어요.

    • 실제 프로젝트에 적용해보면서 문제를 발견하고 개선하세요.
    • 테스트 코드를 먼저 작성하면 코드 변경이 두렵지 않아요.
    • 비슷한 문제를 만났을 때 이 패턴이 떠오르는 게 목표예요.

    요약

    subprocess.run과 os.system을 왜 구분해서 써야 하는지에 대해 정리해봤어요. 핵심은 기본기를 먼저 챙기고, 실제 프로젝트에 적용하면서 다듬어가는 거예요. 처음엔 복잡해 보여도, 한 가지 패턴만 제대로 익혀두면 비슷한 문제에서 재활용할 수 있어요.

    관련 태그: #개발, #테크, #Python, #subprocess, #보안

+ Recent posts