Python 배치 처리: .bat 통합에서 Subprocess Best Practices
I’m happy to translate the article for you, but I need the full text of the post (the content you’d like translated). Could you please paste the article’s body here? Once I have that, I’ll provide a Korean translation while keeping the source link and all formatting exactly as you requested.
Introduction
데이터 분석 및 비즈니스 자동화 분야에서 Python은 배치 처리를 위한 강력한 도구입니다. 반복 작업을 자동화하거나 대용량 데이터를 야간에 처리하든, 가능성은 무궁무진합니다.
“Python을 이용한 배치 처리”는 상황에 따라 다양한 의미를 가질 수 있습니다:
- Python 스크립트를 자동으로 실행해야 하나요?
- Windows 배치 파일(
.bat)에서 Python을 호출하고 싶나요? - 아니면 Python이 다른 외부 프로그램을 제어하도록 해야 하나요?
이 글에서는 다음 핵심 내용을 다룹니다:
- Windows 배치 파일과의 통합
subprocess모듈 마스터하기- 전문 개발을 위한 확장 가능한 프레임워크 탐색
파이썬 배치 처리의 세 가지 패턴
코딩을 시작하기 전에, 어떤 패턴이 필요에 맞는지 확인하세요:
- Pure Python Automation – 모든 작업이 파이썬 안에서 이루어집니다 (파일 I/O, 스크래핑 등).
- Executing Python via Batch Files (
.bat) – Windows 작업 스케줄러나 빠른 데스크톱 바로 가기에 일반적입니다. - Running External Commands from Python – 파이썬을 “명령자”로 사용해 OS 명령이나 다른
.exe파일을 실행합니다.
Source: …
Method 1 – Running Python Scripts from a .bat File
Windows 환경에서는 스크립트를 .bat 파일로 감싸는 것이 예약 작업을 처리하는 표준 방법입니다.
The Basic Setup
script.py와 같은 디렉터리에 run.bat 파일을 생성합니다.
@echo off
cd /d %~dp0
python script.py
pause
@echo off– 터미널 출력에서 불필요한 정보를 제거합니다.cd /d %~dp0– 가장 중요한 라인 – 배치 파일이 위치한 디렉터리로 현재 작업 디렉터리를 설정하여 “File Not Found” 오류를 방지합니다.pause– 실행이 끝난 후 창이 바로 닫히지 않게 하여 오류 메시지를 확인할 수 있게 합니다.
Using Virtual Environments (venv)
프로젝트가 특정 라이브러리에 의존한다면 activate.bat 대신 가상 환경 안에 있는 Python 실행 파일을 직접 지정합니다.
@echo off
cd /d %~dp0
.\venv\Scripts\python.exe script.py
pause
Passing Arguments
배치 파일에서 sys.argv를 이용해 파라미터를 Python으로 전달할 수 있습니다.
run_args.bat
@echo off
cd /d %~dp0
python script.py "test_data" 100
pause
script.py
import sys
args = sys.argv
# args[0]은 스크립트 이름; args[1] 이후가 전달된 파라미터입니다.
print(f"File name: {args[0]}")
if len(args) > 1:
print(f"Argument 1: {args[1]}")
print(f"Argument 2: {args[2]}")
방법 2 – subprocess로 외부 명령 제어
Python 스크립트가 외부 도구나 시스템 명령을 호출해야 할 때, 최신 표준은 subprocess 모듈입니다 (os.system보다 권장됨).
subprocess.run 사용
명령을 실행하고 종료될 때까지 기다리는 가장 일반적인 방법:
import subprocess
# Run a built‑in Windows command
result = subprocess.run(
["dir", "/w"],
shell=True, # Required for built‑in commands like `dir`
capture_output=True,
text=True
)
print("--- Output ---")
print(result.stdout)
팁 – shell=True 보안 위험
shell=True는dir,copy등 내장 명령에 필요합니다.- 외부 실행 파일이나 스크립트의 경우 기본값인
shell=False를 유지하세요. - 신뢰할 수 없는 사용자 입력과 함께
shell=True를 절대 사용하지 마세요 – 명령어 삽입 공격의 문을 열게 됩니다.
오류 처리
외부 명령이 실패했을 때 예외를 발생시키려면 check=True를 사용합니다:
import subprocess
try:
subprocess.run(["unknown_command"], shell=True, check=True)
except subprocess.CalledProcessError as e:
print(f"Command failed with error: {e}")
배치 처리를 위한 전문 프레임워크
프로젝트가 성장함에 따라 수동 스크립트 관리가 악몽이 됩니다. 다음 도구들을 고려해 보세요:
1. 표준 접근법 – argparse & logging
- 로그 레벨을 관리하기 위해
print()를logging모듈로 교체하세요. - 자동 도움말 메뉴가 포함된 전문 CLI를 만들기 위해 **
argparse**를 사용하세요.
2. Click – 인간 친화적인 CLI 도구
Click은 데코레이터를 사용해 복잡한 CLI 명령을 직관적으로 만들어 줍니다.
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name', help='The person to greet.')
def hello(count, name):
for _ in range(count):
click.echo(f"Hello, {name}!")
if __name__ == '__main__':
hello()
3. 워크플로 관리 – Luigi & Airflow
“Task B”가 “Task A”를 기다려야 하는 대규모 시스템의 경우 Apache Airflow 또는 Luigi를 살펴보세요. 이들은 파이프라인을 시각화하고 자동으로 재시도를 처리하는 GUI를 제공합니다.
문제 해결 체크리스트
배치 프로세스가 실패하면 다음 일반적인 원인을 확인하세요:
- 앱 실행 별칭 함정 – Windows 10/11에서
python을 입력하면 Microsoft Store가 열릴 수 있습니다. Settings → Apps → App execution aliases에서 별칭을 비활성화하세요. - 잘못된 작업 디렉터리 –
.bat파일에서는 항상cd /d %~dp0(또는 절대 경로 사용)를 사용하세요. - 가상 환경 활성화 누락 – venv의
python.exe를 직접 지정하거나 스크립트를 실행하기 전에 환경을 활성화하세요.
추가 팁
- Python을 PATH에 추가 – 이 옵션은 Windows 설정의 **“Manage app execution aliases”**에 있습니다.
- 권한 문제 –
C:\Program Files등 시스템 폴더에 쓰기를 시도하는 스크립트는 관리자 권한이 없으면 실패합니다. - 문자 인코딩 – Windows 콘솔에서 일본어 등 특수 문자가 깨져 보이면 Python 스크립트에서 UTF‑8을 강제하세요:
import sys
sys.stdout.reconfigure(encoding='utf-8')
결론
배치 프로세스를 만드는 것은 쉽지만, 신뢰할 수 있는 배치를 구축하려면 세부 사항에 주의를 기울여야 합니다—특히 경로와 오류 처리와 관련해서요. 간단한 .bat 래퍼로 시작하고, 필요에 따라 subprocess 또는 Airflow와 같은 전용 프레임워크로 전환하십시오.
