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 of overwriting 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 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) 활용 - 리눅스 프로그램과 연동
댓글