나는 Wim의 답변이 주장 하는 전략에 약간을 추가 할 것이라고 생각 했습니다 .Django의 적절한 버전을 2.7과 3.x에서 먼저 작동시키고 나에게 도움이되는 몇 가지 전술 을 설명 하십시오.
파이썬 2.7은 3.x에서 방아쇠를 당길 때까지 탈출구입니다.
- 테스트는 두 가지 모두에서 실행되어야합니다
- f-string과 같은 3.x 특정 기능을 사용하지 마십시오
- 첫 번째 Python 3.x, 나중에 2.7에서 실행되지 않는 Django 2.x 만
- 일찍 시작하고 분석하지 말고 빅뱅 접근을 피하십시오
- 처음에는 파일 단위로.
- 테스트 스위트가있는 유틸리티 라이브러리와 같은 가장 낮은 레벨의 코드로 시작하십시오.
- 가능하면 변경 사항을 2.7 프로덕션 분기로 점차 병합하고 3.x 포팅 코드를 최신 변경 사항으로 유지하십시오.
Django의 어떤 마이너 버전으로 시작할까요?
내 기준은 Django 이주가 상당히 관여 할 수 있다는 것입니다 (실제로 2 => 3 작업보다 더 많은 생각이 필요합니다). 그래서 나는 당신이 이미 2.7 사용자에게 어떤 가치를 제공하는 방식으로 최신의 가장 큰 1.11로 이동할 것입니다. 이 1.11에 사전 2.x에서 호환성 심의 좋은 숫자는 아마 와 당신은 2.x는 중단 경고를 받고있을 것입니다.
시작할 파이썬 3.x의 부 버전은 무엇입니까?
타사 라이브러리의 가용성, CI / devops 제품군의 지원 및 선택한 서버 OS 이미지의 가용성과 같은 모든 각도를 고려하는 것이 가장 좋습니다. 예를 들어 언제든지 3.8을 설치하고 requirements.txt 자체를 pip로 설치할 수 있습니다.
활용 자식 (또는 사용 SCM 무엇이든)와 VIRTUALENV .
- 별도의
requirement.txt
파일이지만 ...
- 파일 기반의 git repo 가있는 경우을 사용 하여 동일한 코드 라인 에서 각 venv를 가리킬 수 있습니다
pip install -e <your directory>
. 즉, 서로 다른 2 개의 터미널에서 동일한 단위 테스트에 대해 2.7 및 3.x를 실행할 수 있습니다.
- 다른 포트에서 2.7 및 3.x Django 서버를 나란히 실행할 수도 있고 Firefox 및 Chrome이라고 말할 수도 있습니다.
- 포팅 브랜치에서 자주 커밋하고 git bisect에 대해 배우십시오 .
사용하기 2to3을
예, 2.7 코드와 Django를 허용하면 중단됩니다. 그래서...
이것은 스로틀 명령이 어떻게 생겼는지입니다.
2to3 $tgt -w -f except -f raise -f next -f funcattrs -f print
대량 변환에는 편집기 대신 sed 또는 awk를 사용 하십시오.
장점은 앱의 특정 문제를보다 잘 알게되면 1 개 파일 또는 여러 파일에서 실행될 수있는 변경 사항을 작성하고 2.7 또는 Django를 손상시키지 않고 대부분의 작업을 수행 할 수 있다는 것입니다. 적절하게 던져진 2to3 패스 후에 이것을 적용하십시오 . 그러면 편집기에서 잔여 정리가 이루어지고 테스트가 통과됩니다.
(선택 사항) 2.7 코드 에서 검은 색 으로 시작 합니다.
코드 포맷터 인 black은 Python 3 AST를 사용하여 분석을 실행합니다. 코드를 실행하려고 시도하지 않지만 AST 스테이지에 도달하지 못하게하는 구문 오류를 표시합니다. 그래도 거기에 도착하려면 핍 설치 글로벌 매직을 사용해야하며 블랙의 유용성을 구입해야합니다.
다른 사람들이 해냈습니다. 그들에게서 배우십시오.
# 155를 듣고 파이썬 3으로 옮기기위한 실제 단계 는 작업에 대한 아이디어를 제공해야합니다. 쇼 링크를보십시오. 그들은 공통 코드베이스와 동일한 자식 브랜치에서 2.7 코드를 3.x 구문으로 점진적으로 조정하는 Instagram (?) 움직임을 이야기하는 것을 좋아합니다.
보수적 인 파이썬 3 포팅 안내서 도 참조하십시오
및 Instagram에서 Python 3으로 원활하게 이동 -새로운 스택
결론
Django 1.11 EOL (2020 년 4 월)까지의 시간은 다소 짧으므로 2 개 이상의 개발 리소스가 필요한 경우 다음을 동시에 수행하는 것이 좋습니다.
두 작업이 어떻게 진행되는지 확인하고 Django 관련 프로젝트 위험과 Python 3 통증이 어떻게 보이는지 평가하십시오. 이미 Python 2.7 EOL이 누락되었지만 적어도 몇 달 동안 사용되지 않는 웹 프레임 워크가 레거시 Python 2.7보다 더 위험 할 수 있습니다. 따라서 Django 1.9에서 마이그레이션을 시작하기에 너무 오래 기다리지 않으면 그렇게하는 작업이 낭비되지 않습니다. 진행 상황을 보면 프로젝트 위험이 더 잘 보일 것입니다.
초기 2to3 진행 속도는 느리지 만 툴링 및 안내는 속도를 빠르게 파악할 수있을 정도로 충분하므로 경험을 수집하기 전에이를 과도하게 생각하지 마십시오. Django 측은 프레임 워크의 변경 사항 에 대한 노출에 달려 있기 때문에 일찍 시작하는 것이 가장 좋습니다.
PS (논쟁의 / 개인의 견해) 나는 6 개 또는 다른 통조림의 2 대 3 교량 도서관을 많이 사용하지 않았다 .
그건 되지 는 제 3 자 libs와에 대한 화려한이다 - - 나는 그것을 신뢰하지 않기 때문에 오히려 나는 복잡한 영구적 인 종속성을 추가하지 않았다 (그리고 나는 그것의 문서를 읽기에는 너무 게으른했다). 오랫동안 3.x 호환 구문으로 2.7 코드를 작성했기 때문에 실제로 사용할 필요가 없다고 생각했습니다. 마일리지가 다를 수 있으며 많은 노력이 필요한 경우이 경로를 따르지 않을 수 있습니다 .
대신, 이 유형의 컨텐츠를 사용 하여 py223.py (57 LOC 포함 주석)를 작성했습니다. 대부분은 표준 라이브러리에서 사용 중단 및 이름 변경에 대한 해결 방법과 관련이 있습니다.
try:
basestring_ = basestring
except (NameError,) as e:
basestring_ = str
try:
cmp_ = cmp
except (NameError,) as e:
# from http://portingguide.readthedocs.io/en/latest/comparisons.html
def cmp_(x, y):
"""
Replacement for built-in function cmp that was removed in Python 3
"""
return (x > y) - (x < y)
그런 다음 해당 py223에서 가져 와서 특정 문제를 해결하십시오. 나중에 나는 수입품을 버리고 이상한 isinstance(x, basestr_)
것을 옮길 isinstance(x, str)
것이지만 미리 걱정할 것이 거의 없다는 것을 알고 있습니다.