Python ?쒓뎅???몄퐫???닿껐 ?꾩쟾 媛?대뱶¶
?묒꽦??: 2026-02-09 *????섍꼍: Windows + Cygwin + Python 3.10+ 臾몄젣: subprocess CP949 ?먮윭, print() ?쒓? 源⑥쭚, glob() ?쒓? ?뚯씪紐?誘몄씤??
1. ?듭떖 ?붾(??(5以??붿빟)¶
# 紐⑤뱺 Python ?ㅽ겕由쏀듃 理쒖긽?⑥뿉 蹂듭궗
import sys, os, locale
if sys.platform == 'win32' and not sys.flags.utf8_mode:
if 'PYTHONUTF8' not in os.environ:
os.environ.update({'PYTHONUTF8': '1', 'PYTHONIOENCODING': 'utf-8'})
os.execv(sys.executable, [sys.executable] + sys.argv)
if hasattr(sys.stdout, 'reconfigure'):
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
try: locale.setlocale(locale.LC_ALL, 'ko_KR.UTF-8')
except: pass
*?뚯뒪??寃利?: python scripts/encoding_test.py ??5/5 ?듦낵 ?뺤씤
2. 臾몄젣 吏꾨떒¶
利앹긽¶
subprocess.run(['python', 'validate_opinion.py', '?쒓??뚯씪.md'])??CP949 ?몄퐫???먮윭print("?쒓?")??UnicodeEncodeErrorglob.glob('docs/opinions/2026-*.md')???쒓? ?뚯씪紐낆씠b'\xc7\xd1\xea\xb8\x80'媛숈? 諛붿씠?몃줈 諛섑솚open('?쒓??뚯씪.md')??FileNotFoundError (寃쎈줈 ?몄퐫??遺덉씪移?
?먯씤 遺꾩꽍¶
# 利앹긽 ?ы쁽 ?섍꼍
sys.getdefaultencoding() # 'utf-8'
sys.getfilesystemencoding() # 'utf-8' (Cygwin) ?먮뒗 'mbcs' (Windows)
locale.getpreferredencoding() # 'cp949' ??臾몄젣??洹쇱썝
sys.stdout.encoding # 'cp949' ??stdout??CP949濡??ㅼ젙??```
**?듭떖 臾몄젣**: Python ?대???UTF-8?몃뜲, Windows 肄섏넄/subprocess??CP949瑜??붽뎄 ???몄퐫??遺덉씪移?
---
## 3. ?닿껐 諛⑸쾿 鍮꾧탳
| 諛⑸쾿 | ?④낵 | ?μ젏 | ?⑥젏 |
|:---|:---|:---|:---|
| **?섍꼍蹂?섎쭔** | ??| ?ㅼ젙 媛꾨떒 | ?곕??먮쭏???ъ꽕?? subprocess ?꾪뙆 遺덉븞??|
| **sys.stdout.reconfigure()** | ??| print() ?닿껐 | subprocess 誘명빐寃?|
| **PYTHONUTF8=1 + os.execv()** | ??| ?꾩쟾 ?닿껐 | ?꾨줈?몄뒪 ?ъ떆??(0.1珥??ㅻ쾭?ㅻ뱶) |
**沅뚯옣**: ??媛吏 紐⑤몢 ?곸슜 (蹂댁씪?ы뵆?덉씠??
---
## 4. 蹂댁씪?ы뵆?덉씠???곸슜 ?꾪썑 鍮꾧탳
### ?곸슜 ??```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import io
# 湲곗〈 諛⑹떇 (遺덉셿??
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
# 臾몄젣: subprocess ?쒓? ?몄옄 ?꾨떖 ???ъ쟾??CP949 ?먮윭
?곸슜 ??```python¶
!/usr/bin/env python3¶
-- coding: utf-8 --¶
import sys import os import locale
========================================¶
蹂댁씪?ы뵆?덉씠??(蹂듭궗?섏뿬 ?ъ슜)¶
========================================¶
if sys.platform == 'win32': # Windows?먯꽌 UTF-8 紐⑤뱶 ?쒖꽦?? if not sys.flags.utf8_mode: if 'PYTHONUTF8' not in os.environ: os.environ['PYTHONUTF8'] = '1' os.environ['PYTHONIOENCODING'] = 'utf-8' # ?꾩옱 ?ㅽ겕由쏀듃瑜?UTF-8 紐⑤뱶濡??ъ떎??(filesystem encoding ?ы븿) os.execv(sys.executable, [sys.executable] + sys.argv)
stdout/stderr ?몄퐫??媛뺤젣 (print() ?닿껐)¶
if hasattr(sys.stdout, 'reconfigure'): sys.stdout.reconfigure(encoding='utf-8', errors='replace') sys.stderr.reconfigure(encoding='utf-8', errors='replace')
?쒖뒪??濡쒖???UTF-8濡?蹂寃?(locale.getpreferredencoding() ?닿껐)¶
try: locale.setlocale(locale.LC_ALL, 'ko_KR.UTF-8') except locale.Error: try: locale.setlocale(locale.LC_ALL, 'Korean_Korea.65001') # Windows UTF-8 except locale.Error: pass # ?ㅽ뙣?대룄 吏꾪뻾
========================================¶
???꾨옒遺???먮옒 肄붾뱶 ?묒꽦¶
========================================¶
from pathlib import Path import subprocess
?댁젣 ?쒓? ?뚯씪紐??뺤긽 泥섎━??files = list(Path("docs/opinions").glob("2026-*.md"))¶
for f in files: print(f.name) # ?쒓? 異쒕젰 ?뺤긽 result = subprocess.run([sys.executable, 'script.py', str(f)]) # ?쒓? ?몄옄 ?뺤긽 ?꾨떖
---
## 5. subprocess ?ъ슜 ??二쇱쓽?ы빆
### ?쒓? ?몄옄 ?꾨떖 (?꾩닔 ?⑦꽩)
```python
import subprocess
import sys
import os
result = subprocess.run(
[sys.executable, 'validate_opinion.py', '?쒓??뚯씪.md'],
capture_output=True,
text=True,
encoding='utf-8', # ?꾩닔: stdout/stderr ?붿퐫?? errors='replace', # 源⑥쭊 臾몄옄 ?泥? env={
**os.environ,
'PYTHONIOENCODING': 'utf-8', # ?먯떇 ?꾨줈?몄뒪???꾨떖
'PYTHONUTF8': '1' # UTF-8 紐⑤뱶 ?꾨떖
}
)
print(result.stdout) # ?쒓? 異쒕젰 ?뺤긽
?섎せ????(CP949 ?먮윭 諛쒖깮)¶
# ??encoding ?꾨씫
result = subprocess.run(['python', 'script.py', '?쒓?.md'], capture_output=True)
# ??env ?꾨떖 ?꾨씫
result = subprocess.run(['python', 'script.py', '?쒓?.md'], encoding='utf-8')
# ??text=False (bytes 紐⑤뱶)
result = subprocess.run(['python', 'script.py', '?쒓?.md'], capture_output=True, text=False)
6. pathlib vs os.path 鍮꾧탳¶
pathlib.Path (沅뚯옣)¶
from pathlib import Path
# ?뚯씪 寃??files = list(Path("docs/opinions").glob("2026-*.md"))
# ?뚯씪紐?異쒕젰
for f in files:
print(f.name) # ?쒓? ?뺤긽
# ?뚯씪 ?쎄린
with open(f, 'r', encoding='utf-8') as fp:
content = fp.read()
?μ젏: - ?쒓? 泥섎━ ???덉젙??- Path 媛앹껜媛 ?대??곸쑝濡??몄퐫??泥섎━ - ?꾨??곸씤 API (Python 3.4+)
glob.glob (蹂댁씪?ы뵆?덉씠???곸슜 ???ъ슜 媛??¶
import glob
import os
# ?뚯씪 寃??pattern = os.path.join("docs/opinions", "2026-*.md")
files = glob.glob(pattern)
# ?뚯씪紐?異쒕젰
for f in files:
print(os.path.basename(f)) # 蹂댁씪?ы뵆?덉씠???곸슜 ???쒓? ?뺤긽
二쇱쓽: 蹂댁씪?ы뵆?덉씠???놁쑝硫??쒓? ?뚯씪紐낆씠 諛붿씠??臾몄옄?대줈 諛섑솚?????덉쓬
寃곕줎: pathlib 沅뚯옣, os.path???덇굅??肄붾뱶?먯꽌留?¶
7. ?뚯씪 ?묒뾽 沅뚯옣 ?⑦꽩¶
?뚯씪 ?쎄린¶
from pathlib import Path
# UTF-8 紐낆떆 (?꾩닔)
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# ?먮뒗
content = Path(file_path).read_text(encoding='utf-8')
?뚯씪 ?곌린¶
# UTF-8 紐낆떆 (?꾩닔)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
# ?먮뒗
Path(file_path).write_text(content, encoding='utf-8')
?뚯씪 寃??```python¶
?⑥씪 ?붾젆?좊━¶
files = list(Path("docs/opinions").glob("2026-*.md"))
?ш? 寃??files = list(Path("docs").rglob("*.md"))¶
?뺣젹 (?좎쭨??¶
files.sort(key=lambda f: f.name, reverse=True)
---
## 8. ?ㅼ쟾 ?곸슜 媛?대뱶
### 8.1. ?좉퇋 ?ㅽ겕由쏀듃 ?묒꽦 ??```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
?ㅽ겕由쏀듃 ?ㅻ챸
"""
import sys
import os
import locale
# === 蹂댁씪?ы뵆?덉씠??蹂듭궗 (scripts/encoding_boilerplate.py 李멸퀬) ===
if sys.platform == 'win32':
if not sys.flags.utf8_mode:
if 'PYTHONUTF8' not in os.environ:
os.environ['PYTHONUTF8'] = '1'
os.environ['PYTHONIOENCODING'] = 'utf-8'
os.execv(sys.executable, [sys.executable] + sys.argv)
if hasattr(sys.stdout, 'reconfigure'):
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
try:
locale.setlocale(locale.LC_ALL, 'ko_KR.UTF-8')
except locale.Error:
try:
locale.setlocale(locale.LC_ALL, 'Korean_Korea.65001')
except locale.Error:
pass
# === 蹂댁씪?ы뵆?덉씠????===
# ?먮옒 肄붾뱶
from pathlib import Path
...
8.2. 湲곗〈 ?ㅽ겕由쏀듃 ?섏젙 ??1. 湲곗〈 ?몄퐫??肄붾뱶 ?쒓굅:¶
-
蹂댁씪?ы뵆?덉씠??異붽? (import 臾?諛붾줈 ?꾨옒)
-
subprocess ?몄텧遺 ?섏젙:
8.3. ?곗꽑?쒖쐞 ?곸슜 ???1. validate_opinion.py (?쒓? ?뚯씪紐?泥섎━)¶
- update_indices.py (glob ?쒓? ?뚯씪 寃??
- deploy.py (subprocess ?몄텧)
- status_manager.py (JSON ?쒓? 泥섎━)
- copy_to_korean.py (?쒓? ?뚯씪紐?蹂듭궗)
9. ?섍꼍蹂?섎쭔 ?ㅼ젙?섎뒗 諛⑸쾿 (鍮꾧텒??¶
?ㅽ겕由쏀듃瑜??섏젙?????녿뒗 寃쎌슦 ?곕??먯뿉???ㅼ젙:
Bash¶
CMD¶
PowerShell¶
?⑥젏: - ?곕????몄뀡留덈떎 ?ъ꽕???꾩슂 - subprocess ?꾪뙆 遺덉븞??- ?ㅻⅨ ?щ엺???ㅽ뻾 ???딄린 ?ъ?
沅뚯옣: 蹂댁씪?ы뵆?덉씠?몃? ?ㅽ겕由쏀듃???ы븿 (?섍꼍蹂???ㅼ젙 遺덊븘??
10. ?뚯뒪??諛⑸쾿¶
?꾩껜 ?뚯뒪??```bash¶
cd
珥?5媛?以?5媛??듦낵 (100%)
### 媛쒕퀎 ?뚯뒪??```python
# ?뚯뒪??1: ?쒓? 異쒕젰
print("?덈뀞?섏꽭??)
# ?뚯뒪??2: glob
from pathlib import Path
files = list(Path("docs/opinions").glob("2026-*.md"))
print(f"李얠? ?뚯씪: {len(files)}媛?)
# ?뚯뒪??3: open
with open(files[0], 'r', encoding='utf-8') as f:
print(f.read(50))
# ?뚯뒪??4: subprocess
import subprocess, sys, os
result = subprocess.run(
[sys.executable, '-c', 'print("?쒓?")'],
capture_output=True,
text=True,
encoding='utf-8',
env={**os.environ, 'PYTHONIOENCODING': 'utf-8', 'PYTHONUTF8': '1'}
)
print(result.stdout)
11. ?듭떖 ?먮━ (?곸꽭 ?ㅻ챸)¶
PYTHONUTF8=1????븷¶
- Python 3.7+ UTF-8 紐⑤뱶 ?쒖꽦??-
sys.getfilesystemencoding()??媛뺤젣濡?'utf-8' 諛섑솚 locale.getpreferredencoding()??'utf-8' 諛섑솚 (CP949 臾댁떆)- glob(), open(), Path() 紐⑤몢 UTF-8 湲곗??쇰줈 ?숈옉
PYTHONIOENCODING=utf-8????븷¶
sys.stdin,sys.stdout,sys.stderr?몄퐫??媛뺤젣- subprocess ?먯떇 ?꾨줈?몄뒪???꾨떖
- print() ?쒓? 異쒕젰 臾몄젣 ?닿껐
sys.stdout.reconfigure()????븷¶
- ?고??꾩뿉 ?대? ?대┛ stdout???몄퐫??蹂寃?- PYTHONIOENCODING蹂대떎 ?곗꽑?쒖쐞 ?믪쓬
- ?꾨줈?몄뒪 ?ъ떆???놁씠 利됱떆 ?곸슜
os.execv()????븷¶
- ?섍꼍蹂??蹂寃????꾩옱 ?꾨줈?몄뒪瑜?媛숈? ?몄옄濡??ъ떎??- filesystem encoding? ?꾨줈?몄뒪 ?쒖옉 ??寃곗젙?섎?濡??ъ떆???꾩닔
- 0.1珥??뺣룄 ?ㅻ쾭?ㅻ뱶 (??踰덈쭔 諛쒖깮)
locale.setlocale()????븷¶
- C ?쇱씠釉뚮윭由?濡쒖???蹂寃?-
locale.getpreferredencoding()諛섑솚媛?蹂寃?- ?쇰? ?쒕뱶?뚰떚 ?쇱씠釉뚮윭由?pandas, numpy)???쒓? 泥섎━ 媛쒖꽑
12. ?먯< 臾삳뒗 吏덈Ц (FAQ)¶
Q1: os.execv() ?뚮Ц???ㅽ겕由쏀듃媛 ??踰??ㅽ뻾?섎굹??¶
A: ?꾨땲?? 泥?踰덉㎏ ?ㅽ뻾? ?섍꼍蹂???뺤씤 ??利됱떆 ?ъ떎?됱쑝濡??泥대맗?덈떎. ?ъ슜???낆옣?먯꽌????踰??ㅽ뻾??寃껋쿂??蹂댁엯?덈떎.
Q2: 蹂댁씪?ы뵆?덉씠?몃? 紐⑤뱺 ?ㅽ겕由쏀듃???l뼱???섎굹??¶
A: ?쒓? ?뚯씪紐?異쒕젰???ㅻ(???ㅽ겕由쏀듃?먮쭔 ?꾩슂?⑸땲?? ?섏?留??l뼱???닿? ?놁쑝誘濡? ?쇨??깆쓣 ?꾪빐 紐⑤뱺 ?ㅽ겕由쏀듃??異붽?瑜?沅뚯옣?⑸땲??
Q3: Python 2.x?먯꽌???묐룞?섎굹??¶
A: ?꾨땲?? PYTHONUTF8? Python 3.7+, sys.stdout.reconfigure()??Python 3.7+?낅땲?? Python 2??吏?먰븯吏 ?딆뒿?덈떎.
Q4: Linux/Mac?먯꽌???꾩슂?쒓???¶
A: ?꾨땲?? if sys.platform == 'win32' 議곌굔?쇰줈 Windows?먯꽌留??ㅽ뻾?⑸땲?? Linux/Mac? 湲곕낯?곸쑝濡?UTF-8?대?濡?遺덊븘?뷀빀?덈떎.
Q5: 蹂댁씪?ы뵆?덉씠?몃? ?l뿀?붾뜲???먮윭媛 ?섏슂.¶
A:
1. python scripts/encoding_test.py ?ㅽ뻾?섏뿬 ?섍꼍 ?뺤씤
2. subprocess ?몄텧 ??encoding='utf-8', env={...} 鍮좊쑉由ъ? ?딆븯?붿? ?뺤씤
3. ?뚯씪 open ??encoding='utf-8' 紐낆떆 ?뺤씤
Q6: ?ㅻⅨ ?щ엺 而댄벂?곗뿉?쒕룄 ?묐룞?섎굹??¶
A: ?? 蹂댁씪?ы뵆?덉씠?멸? ?ㅽ겕由쏀듃???ы븿?섏뼱 ?덉쑝誘濡? ?ㅻⅨ Windows 而댄벂?곗뿉?쒕룄 ?숈씪?섍쾶 ?묐룞?⑸땲?? ?섍꼍蹂???ㅼ젙 遺덊븘??
13. 泥댄겕由ъ뒪??¶
諛고룷 ???뺤씤?ы빆:
- ?좉퇋/?섏젙 ?ㅽ겕由쏀듃??蹂댁씪?ы뵆?덉씠??異붽?
- subprocess ?몄텧遺??
encoding='utf-8',env={...}異붽? - ?뚯씪 open ??
encoding='utf-8'紐낆떆 -
python scripts/encoding_test.py5/5 ?듦낵 ?뺤씤 - ?ㅼ젣 ?쒓? ?뚯씪紐낆쑝濡??ㅽ겕由쏀듃 ?ㅽ뻾 ?뚯뒪??
14. 李멸퀬 ?먮즺¶
- ?뚯뒪???ㅽ겕由쏀듃:
scripts/encoding_test.py - *蹂댁씪?ы뵆?덉씠??:
scripts/encoding_boilerplate.py - PEP 540: Python UTF-8 Mode (https://peps.python.org/pep-0540/)
- Python Docs: sys.flags.utf8_mode (https://docs.python.org/3/library/sys.html#sys.flags)
15. 留덈Т由?¶
??媛?대뱶??Windows + Cygwin + Python ?섍꼍?먯꽌 ?쒓뎅???뚯씪紐?異쒕젰 臾몄젣瑜?肄붾뱶 ?덈꺼?먯꽌 ?꾩쟾???닿껐?섎뒗 諛⑸쾿???쒖떆?⑸땲??
?듭떖 ?먯튃: 1. 紐⑤뱺 ?ㅽ겕由쏀듃??蹂댁씪?ы뵆?덉씠??異붽? (5以? 2. subprocess ?ъ슜 ??encoding + env ?꾨떖 (3以? 3. ?뚯씪 ?묒뾽 ??encoding='utf-8' 紐낆떆 (1以?
*?뚯뒪??寃利?: python scripts/encoding_test.py ??5/5 ?듦낵
臾몄젣 諛쒖깮 ??encoding_test.py 寃곌낵瑜?泥⑤??섏뿬 臾몄쓽?섏꽭??