웹사이트 검색

Python 2 코드를 Python 3으로 변환


이 페이지에서

  1. Python 3이 Python 2와 하위 호환된다고 생각했습니까?\n
  2. Python 2와 Python 3의 몇 가지 차이점
  3. 대부분 자동으로 Python 2에서 Python 3으로 변환\n
  4. 2to3 실행\n
  5. Modernize는 2to3을 둘러싼 래퍼입니다.
  6. 테스트, 테스트, 테스트
  7. 결론
  8. 링크

Python 2는 2020년 1월 1일에 수명이 종료되었습니다. Python 3은 2008년부터 사용할 수 있었지만 처음에는 Python 3에서 사용할 수 없었던 라이브러리에 대한 종속성 때문에 2에서 3으로 변환하는 속도가 느렸습니다. Python 2보다 느리고 Python 2가 많은 사람들에게 꽤 잘 작동했기 때문입니다. Python 2 수명 종료는 더 이상 지원되는 릴리스가 없으며 Python의 버그 수정이 없음을 의미합니다. Ubuntu 및 Red Hat과 같은 일부 Linux 배포판은 한동안 Python 2를 지원하지만 Python 3으로 마이그레이션하는 것이 더 나은 솔루션입니다.

Python 3이 Python 2와 하위 호환된다고 생각했습니까?

100%는 아닙니다. Python 2에서 Python 3으로의 변경은 Python 2의 일부 문제를 "수정"할 기회로 삼았습니다. 그 중 유니코드를 언어 전반에 걸쳐 보다 균일하게 홍보하고 print가 문장이 아닌 구문의 일부 문제를 해결하기 위한 것입니다. 함수보다.

Python 2와 Python 3의 몇 가지 차이점

print, exec 및 기타와 같은 여러 문이 내장 함수로 변경되었습니다. 예:

print 'hello world' # valid python 2 not in python 3
print ('hello world') # valid python 3 and later versions of python 2

정수 나눗셈도 변경되었습니다. 예:

print (5 / 2) # in python 2 result is 2 in python 3 result is 2.5

// 이전 동작을 지원하기 위해 Python 3에 추가되었습니다.

이제 많은 함수가 파이썬 2의 ascii/str 문자열 대신 파이썬 3의 유니코드/바이트를 반환합니다. 예:

type (subprocess.checkout_output('cmd')) # returns <class 'bytes'> <class 'bytes'=""> in python 3 vs <type 'str'><type 'str'=""> in python 2

python 3 를 문자열로 변환하려면 .decode(ascii) 옵션을 사용해야 합니다.

type (subprocess.check_output('ls').decode('ascii')) # will result in a <class 'str'><class 'str'=""> in python 3

일부 도서관이 개편되었습니다.

예를 들어 python2 라이브러리 urllib2는 Python 3에서 urllib로 대체되었습니다. Python 3의 Urllib는 urllib.request 및 urllib.error와 같은 모듈에서도 사용할 수 있으므로 가져오기하여 Python 2와 유사한 기능을 얻을 수 있습니다.

from urllib import urlopen # python 2
from urllib.request import urlopen # python 3

대부분 자동으로 Python 2에서 Python 3으로 변환

Python 스크립트를 Python 2에서 Python 3으로 직접 변환하기 위해 모든 변경을 수행할 수 있지만 많은 작업을 대신 수행할 도구가 있습니다. 2to3는 pip 라이브러리에서 설치할 수 있는 패키지이며 많은 배포 저장소에서 별도의 패키지로도 사용할 수 있습니다. pip3를 통해 설치하려면

% pip3 install 2to3

Debian/Ubuntu에 설치하려면

% sudo apt install 2to3

Fedora/CentOS에 설치하려면

% sudo yum install 2to3

참고: pip에서 설치하면 최신 버전을 얻을 수 있지만 배포 버전은 약간 이전 버전일 수 있으므로 pip 설치가 더 잘 작동할 수 있습니다.

2to3 실행

$ 2to3 --help # will provide you the help message from the system

몇 가지 흥미로운 옵션

-l                  # will provide a list of the fixes available in 2to3.  E.g. print, exec, urllib, and others
-x                  # explicitly not run a transformation, use if one of the "fixes" doesn't work for your code base
-o                  # output dir, put transformed files into another location
--add-suffix=SUFFIX # put a suffix on converted files --add-suffix='3', will convert .py files to .py3 files
-w                  # overwrite current files with modified files

Python 2 코드(scripts)의 디렉터리와 Python 3 코드(scripts3)의 대상 폴더가 있다고 가정하면 다음을 수행할 수 있습니다. 변환을 수행하는 명령은 다음과 같습니다.

% 2to3 scripts -n -w -o scripts3

옵션은 다음과 같습니다

scripts  - source dir
-n       - no backups
-w       - write-unchanged files, write file even if no changes are required by 2to3
-o       - output directory
scripts3 - output directory, where the converted scripts are written

이렇게 하면 원래 코드가 수정되지 않고 사용자가 scripts3 폴더에서 변환된 코드를 검토하고 여전히 원래 코드를 참조할 수 있습니다.

Modernize는 2to3을 둘러싼 래퍼입니다.

Python 3.1 및 Python 3.2를 지원하는 데 도움이 되는 6개의 도우미 함수를 사용하는 --six-unicode 플래그를 지원한다는 점을 제외하면 2to3과 유사한 동작을 합니다. 현대화에 추가되어 사용을 권장하는 강력한 기능이 없다면 2to3을 사용하겠습니다. 현대화는 Debian 테스트 및 Arch와 같은 일부 배포판에서도 사용할 수 있습니다. 설치하기 위해서

# pip3 install modernize

실행하려면

# python-modernize --help

도스

Do conversion in small chunks
Do use tools like pylint to help you figure out problematic code, before you convert it
Do compare the code before and after the conversion
Do use the debugger to validate critical code

금지 사항

Do not overwrite your code with 2to3, recommend a separate directory
Do not trust in the tools to do everything correctly

테스트, 테스트, 테스트

코드를 Python 2에서 Python 3으로 변환하는 방법에 관계없이 철저하게 테스트해야 합니다. 미션 크리티컬 파이썬 코드의 경우 파이썬 디버거를 사용하여 코드를 한 줄씩 실행하는 것이 좋습니다.

# python3 -m pdb  # will run the script in the python debugger 

그런 다음 n을 입력하여 스크립트의 다음 줄로 이동하고 q을 입력하여 디버거를 종료합니다.

결론

Python 2는 길고 유익한 삶을 보낸 후 죽었습니다. 여전히 Python 2를 사용하고 있다면 Python 3으로 변환해야 합니다. Python은 2to3에서 Python 2에서 Python 3으로 변환하는 데 도움이 되는 도구를 제공하고 많은 작업을 수행합니다. 2to3는 완벽한 도구는 아니지만 많은 작업을 수행하고 Python 2에서 3으로 변환하는 복잡성을 몇 배나 줄일 수 있습니다.

연결

  • 파이썬 문서 라이브러리 https://docs.python.org/3/library/2to3.html의 2to3 페이지
  • 현대화 라이브러리 https://pypi.org/project/modernize/\n
  • python.org https://docs.python.org/3/howto/pyporting.html에서 Python 2 코드를 Python 3 페이지로 포팅