본문 바로가기
SW 개발/Python

Python 2.x에서 3.x으로 코드 자동 변환: 2to3 와 __future__ 사용

by Kibua20 2021. 8. 15.

Python 코드를 다루다 보면 기존 Python 2.x 에서 개발된 오픈 소스를 Python 3.x으로 migration 해야 하는 경우가 종종 있습니다. 이 경우 코드 한 줄씩 변경하는 것보다 일괄로 변경해주는 Tool을 활용하는 것이 편리합니다.  Python에서는 2to3로 변화는 tool을 제공합니다.  이는 lib2to3 기반으로 사용하고 있고, Python3과 100% 호환성 있는 코드까지는 아니지만 많은 수 작업 부분을 줄일 수는 방법을 설명합니다. 

 

  • Python 2to3 설명서: Python 공식 문서
  • 사용 결과: Python 3.x 버전과 100% 호환성이 있는 코드는 아니지만 수작업 부분을 많이 감소시킴

 

설치

2to3는 Python 3 설치 시 같이 설치됩니다.  (참고로, 우분투에서 apt로도 설치 가능합니다.)

 

$ /usr/bin/2to3-2.7

python3-lib2to3

 

 

사용법

$ 2to3-2.7 --help​ 메뉴로 확인하기 여러 가지 실행 옵션이 나옵니다. 

 

Usage: 2to3 [options] file|dir ...

 

Options:

  -h, --help            show this help message and exit

  -d, --doctests_only   Fix up doctests only

  -f FIX, --fix=FIX     Each FIX specifies a transformation; default: all

  -j PROCESSES, --processes=PROCESSES  Run 2to3 concurrently

  -x NOFIX, --nofix=NOFIX  Prevent a transformation from being run

  -l, --list-fixes      List available transformations

  -p, --print-function  Modify the grammar so that print() is a function

  -v, --verbose         More verbose logging

  --no-diffs            Don't show diffs of the refactoring

  -w, --write           Write back modified files

  -n, --nobackups       Don't write backups for modified files

  -o OUTPUT_DIR, --output-dir=OUTPUT_DIR​  Put output files in this directory instead ofoverwriting the input files.  Requires -n.

  -W, --write-unchanged-files Also write files even if no changes were required  (useful with --output-dir); implies -w.

  --add-suffix=ADD_SUFFIX

      Append this string to all output filenames. Requires-n if non-empty.  ex: --add-suffix='3' will generate .py3 files.

 

사용 예제

Python 3.x으로 변환된 py code는 '-o' 옵션으로 output 폴더는 ./temp에 저장하고 -n -w  옵션으로 pk.py, bytecode.py, dvm_permission.py, util.py, zipfile.py를 변환하는 예제입니다.

 

$ 2to3-2.7 -o temp -n -w pk.py  bytecode.py  dvm_permissions.py   util.py  zipfile.py

 

변환 결과:

Python 3.x 으로 변환 결과

 

Python 2x →3.x 변환 내용

Python 2x →3.x 변환 내용은 다음과 같습니다. 상세 list는 Python 공식 문서를 참고해주세요. 

 

  • apply(function, *args, **kwargs)  function(*args, **kwargs)
  • asserts () 이름 변경
  • basestring → str 
  • dict method 변환: dict.keys(), dict.items() 
  • except X, T except X as T
  • execfile() 제거
  • filter() 함수    list(filter())
  • dict.has_key(key)  key in dict 
  • import 경로 수정
  • long  int로 type변경
  • os.getcwdu() os.getcwd()

 

__future__  사용법

파이썬 코드를 검토하다 보면 코드의 최상단에  __future__ import print_function 을 볼 수 있습니다. __future__는 Python 2.x 코드에서 3.x 문법을 사용할 수 있게 해줍니다.  Python 2.x 버전하고 3.x 버전에서 차이점을 가장 많이 느끼는 print 함수를 예를 들도록 하겠습니다.  Python 2.1 버전부터 __future__ 구문을 사용할 있습니다.

 

# python 2.x 

print 'hello world'

 

#python 3.x 

print ('hello world')

 

# python 2.x버전에서 python 3.x 문법 사용

from __future__ print_function

print ('hello world')

 

 

__future__ 로 사용할 수 있는 구문은 다음과 같습니다. (공식 문선 참고)

 

 

관련 글

[모바일 SW 개발/Python] - Python으로 압축 파일 다루기: Zipfile 과 shutil.make_archive()

[모바일 SW 개발/Python] - Python 음수 인덱스: line.split('+')[-1] 또는 line.split('/')[-1] 의미

[모바일 SW 개발/Python] - Python에서 URL 한글 깨짐 현상: quote_plus()와 unquote_plus()

[모바일 SW 개발/Android] - Python BeautifulSoup으로 만든 Apk download 자동화 (Sample code)

[모바일 SW 개발/Python] - Python: 날짜와 시간 처리 함수(현재 날짜, 어제 날짜, UTC 시간)

[모바일 SW 개발/Python] - Python: xmltodict를 활용하여 XML를 JSON으로 변환하는 방법

[모바일 SW 개발/Python] - Python 명령어 처리: Argparse 모듈 (ArgumentParser 사용 예제)

[모바일 SW 개발/Python] - Python에서 사용자 입력 받는 방법: input()

[모바일 SW 개발/Android] - Android에서 Python 실행 (SL4A와 Termux 활용)

[모바일 SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법

[개발환경/Web Server] - Python: Web Framework Flask 사용하기

[모바일 SW 개발/Python] - Python code 숨기는 방법: PyInstaller로 실행 파일 만들기

[모바일 SW 개발/Python] - Python 여러 버전 설치 방법 (3.x and 3.y 동시 설치)

[모바일 SW 개발/Python] - Python 폴더 및 파일 처리 함수 모음

[모바일 SW 개발/Python] - Python: 폴더 백업 기능 구현 (7zip 압축, Sample code)

[모바일 SW 개발/Python] - Python 소스 숨기는 방법: pyc 활용 (Bytecode로 컴파일)

[모바일 SW 개발/Python] - Python JSON 사용 시 TypeError: Object of type bytes is not JSON serializable

[모바일 SW 개발/Python] - Python 2.7과 3.8호환성: a bytes-like object is required, not 'str'에러 수정

[모바일 SW 개발/Python] - Python 표준 입출력(stdin/stdout) 활용 - 리눅스 프로그램과 연동

 

 

 

 




댓글