콘텐츠로 이동

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. 臾몄젣 吏꾨떒

利앹긽

  1. subprocess.run(['python', 'validate_opinion.py', '?쒓??뚯씪.md']) ??CP949 ?몄퐫???먮윭
  2. print("?쒓?") ??UnicodeEncodeError
  3. glob.glob('docs/opinions/2026-*.md') ???쒓? ?뚯씪紐낆씠 b'\xc7\xd1\xea\xb8\x80' 媛숈? 諛붿씠?몃줈 諛섑솚
  4. 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. 湲곗〈 ?몄퐫??肄붾뱶 ?쒓굅:

# ??젣??肄붾뱶
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
  1. 蹂댁씪?ы뵆?덉씠??異붽? (import 臾?諛붾줈 ?꾨옒)

  2. subprocess ?몄텧遺€ ?섏젙:

    # ?섏젙 ??   subprocess.run(['python', 'script.py', arg])
    
    # ?섏젙 ??   subprocess.run(
        [sys.executable, 'script.py', arg],
        encoding='utf-8',
        env={**os.environ, 'PYTHONIOENCODING': 'utf-8', 'PYTHONUTF8': '1'}
    )
    

8.3. ?곗꽑?쒖쐞 ?곸슜 ?€??1. validate_opinion.py (?쒓? ?뚯씪紐?泥섎━)

  1. update_indices.py (glob ?쒓? ?뚯씪 寃€??
  2. deploy.py (subprocess ?몄텧)
  3. status_manager.py (JSON ?쒓? 泥섎━)
  4. copy_to_korean.py (?쒓? ?뚯씪紐?蹂듭궗)

9. ?섍꼍蹂€?섎쭔 ?ㅼ젙?섎뒗 諛⑸쾿 (鍮꾧텒??

?ㅽ겕由쏀듃瑜??섏젙?????녿뒗 寃쎌슦 ?곕??먯뿉???ㅼ젙:

Bash

export PYTHONUTF8=1
export PYTHONIOENCODING=utf-8
python script.py

CMD

set PYTHONUTF8=1
set PYTHONIOENCODING=utf-8
python script.py

PowerShell

$env:PYTHONUTF8="1"
$env:PYTHONIOENCODING="utf-8"
python script.py

?⑥젏: - ?곕????몄뀡留덈떎 ?ъ꽕???꾩슂 - subprocess ?꾪뙆 遺덉븞??- ?ㅻⅨ ?щ엺???ㅽ뻾 ???딄린 ?ъ?

沅뚯옣: 蹂댁씪?ы뵆?덉씠?몃? ?ㅽ겕由쏀듃???ы븿 (?섍꼍蹂€???ㅼ젙 遺덊븘??


10. ?뚯뒪??諛⑸쾿

?꾩껜 ?뚯뒪??```bash

cd python scripts/encoding_test.py

**湲곕? 寃곌낵**:
???듦낵: ?쒓? 異쒕젰 ???듦낵: pathlib.glob ???듦낵: open() ?쒓??뚯씪 ???듦낵: subprocess ?쒓??몄옄 ???듦낵: pathlib vs os.path

珥?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.py 5/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 寃곌낵瑜?泥⑤??섏뿬 臾몄쓽?섏꽭??