Python2에서 Python3 코드로 변환하는 데 가장 적합한 Python & Django 버전은 무엇입니까?


11

현재 나는 python2 오래된 큰 장고 프로젝트를 python3 버전으로 변환 해야하는 대기업에서 일하고 있습니다. 그래서 많은 연구와 관련이 있지만 변환에 가장 적합한 Python 및 Django 버전과 관련된 완벽한 답변을 찾을 수는 없습니다.

현재 필자는 이전 버전에서 Python : 2.7.16 & Django : 1.9.13을 사용하고 있습니다.

누구나 python2에서 python3로 변환하기 위해 이전 버전의 Python & Django에 가장 적합한 버전을 제안 할 수 있습니다.


python3의 현재 버전은 Python 3.8이고 최신 버전의 Django는 Django 3.0입니다. Django의 웹 사이트는 최신 버전의 python 3 3.8을 권장합니다 . 파이썬과 장고를 최신 버전으로 가속하고 싶지 않은 특별한 이유가 있습니까?
Green Cloak Guy

2
필자는 며칠 전 몇 년 동안 유지 관리 한 Django 기반 웹 사이트가 실제로 python2.7을 사용하여 호스팅 된 서버에서 실제로 실행되는 반면 python3을 사용하여 로컬로 실행한다는 것을 깨달았습니다. 7. 내가 찾은 유일한 차이점은 f- 문자열을 처음으로 어딘가에 사용하려고 시도했는데 웹 서버의 버전이 충돌했을 때입니다. 그렇지 않으면 테스트 및 기능 추가를 위해 로컬 및 원격으로 정확히 예상대로 (정확히 동일) 실행되었습니다. 전적으로 일화적인 결론은 장고가 일반적으로 대부분의 것들과 호환된다는 것입니다.
Green Cloak Guy

1
최신 버전의 경우 최신 버전에서는 새로운 업데이트와 관련하여 문제가있는 경우 때로는 솔루션을 찾기가 어려울 수 있으므로 일부 사람들은 권장하지 않는 것으로 나타났습니다. 현재 프로젝트에서 이러한 종류의 위험을 피하고 싶지 않습니다. 테스트 목적으로, 프로젝트를 최신 django가있는 python 3.7.3 최신 버전으로 변환하기 시작했으며 이미 30 가지 문제를 발견했습니다.
Moon

주목해야합니다-이 질문은 나를 위해 검토 감사에서 나왔습니다. "문서 나 참조가 있습니까?"라는 주제는 매우 명확하지 않습니다 (외부 사이트 요청). 그러나 질문이 아래의 대답으로 더 잘 전달되도록 편집 할 수 있다고 생각합니다.
theMayer

답변:


3

나는 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를 허용하면 중단됩니다. 그래서...

  • 미리보기 모드 또는 단일 파일에 대해 실행하십시오. 그것이 무엇을했는지 보시고 그것이 옳은 일을 보시기 바랍니다.

  • 2.7 또는 Django를 위반 하지 않는 특정 전환으로 만 조절하십시오 . print x=> print (x)이며 except(Exception) as e2 명입니다.

이것은 스로틀 명령이 어떻게 생겼는지입니다.

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 개 이상의 개발 리소스가 필요한 경우 다음을 동시에 수행하는 것이 좋습니다.

  • DEV # 1 : 2.7을 사용하여 Django 1.11 범프 (Django 1.11이 Django 2.x 로의 점프 지점으로 가장 잘 위치한다는 이론)에서 시작합니다.

  • DEV # 2 : 장고가 아닌 유틸리티 코드의 Python 3.6 / 3.7에서 시작하십시오. 이 시점에서 코드는 2.7과 호환되므로 원하는대로 # 1에 병합하십시오.

두 작업이 어떻게 진행되는지 확인하고 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)것이지만 미리 걱정할 것이 거의 없다는 것을 알고 있습니다.


좋은 조언. Django 자체는 이미 six호환성 계층을 사용하고 있으므로 전환 중에 Django 프로젝트에서 사용하려면 "복잡한 영구 종속성을 추가하지 않습니다".
wim

@wim. 다시 동의합니다. 여섯, 그러나 그것은 관점에 달려 있습니다. 이미 타사 라이브러리와 함께 제공되므로 요구 사항과 전체 종속성 측면에서 "비용"이 들지 않습니다. 그러나 나는 (아마 잘못 ) 코드 중간에 큰 블랙 박스 / 사마귀 라고 생각했습니다 . 인스턴스 문자열 / 유니 코드 /베이스 문자열 테스트와 같은 일을하고 직접 수행하는 방법을 알고 있다면 더 이상 필요하지 않은 심을 백업하는 방법을 정확하게 알고 있습니다. 그래도 끝까지 옮길 것입니다.
JL Peyret

그것은의 pip install -e ...(소문자로 -e), 맞죠?
thebjorn

아마 그렇습니다. 수정합니다
JL Peyret에게

3

내 제안은 먼저 Django==1.11.26Python 2와 Python 3을 모두 지원하는 Django의 최신 버전 인 (으)로 업그레이드 하는 것입니다. 현재로서는 Python 2.7의 현재 버전을 유지하십시오.

1.10.x 및 1.11.x 릴리스 노트를 자세히 읽고 사용 중단 여부를 확인하고 1.9.x 코드에서 작동하지 않는 항목을 수정하십시오. 상황이 깨질 것입니다. 장고가 빠르게 움직입니다. 큰 Django 프로젝트의 경우 많은 코드 변경이 필요할 수 있으며 많은 타사 플러그인 또는 라이브러리를 사용하는 경우 버전을 저글링해야 할 수도 있습니다. 타사의 종속성 중 일부는 완전히 폐기되었을 수 있으므로 대체를 찾거나 기능을 제거해야합니다.

각 버전 업그레이드에 대한 출시 정보를 찾으려면 Google "Django의 새로운 기능"을 참조하십시오. 조회수는 모든 지원 중단 및 변경 사항을 세 심하게 문서화합니다.

웹 애플리케이션이 모든 검사를 통과하여, 장고 1.11에서 잘 작동 할 수 나타나면 (당신은 권리, 테스트 스위트가?) 당신은 같은 장고 버전을 유지하는 동안, 파이썬 3 변환을 할 수 있습니다. Django 1.11은 최대 Python 3.7을 지원하므로 타겟팅하기에 좋은 버전입니다. 바이트와 ​​텍스트 사이의 암시 적 변환이 사라지고 많은 Python 2 웹 응용 프로그램이 그에 의존하기 때문에 모든 곳에서 유니 코드를 기대하십시오.

Django 1.11 및 Python 3.7에서 프로젝트가 제대로 작동하면 이전과 동일한 프로세스를 통해 Django 3.0으로 업그레이드하는 것에 대해 생각할 수 있습니다-릴리스 노트 읽기, 필요한 변경, 테스트 스위트 실행 및 체크 아웃 개발자 서버의 webapp를 수동으로


1
확실히 갈 길. 테스트 코드를 2.7 및 3.x에서 모두 실행하십시오. 와 같은 git repo를 가리키는 2 개의 다른 virtualenvs를 가질 수 있습니다 pip install -E. 단위 테스트가 실행되면 Django-on-3x의 테스트 사용을 시작하고 다시 2와 3에서 코드 작동을 유지하십시오.주의해서 코딩하고 2.7 개의 브리지를 태우지 않도록주의하십시오. 예를 들어 문자열은 없습니다. 매우 진드기. 3.x가 완전히 안정되면 3.x 전용 코드를 사용하십시오. 장점은 생산 2.7이 항상 전환 될 때까지 진행된다는 것입니다.
JL Peyret 2012

2

먼저 py3으로 업그레이드합니다. 당신은보고해야 setup.py안정적인 / 1.9.x 지점 (에 장고의 repo에 https://github.com/django/django/blob/stable/1.9.x/setup.py py3 것을 알아낼) 지원되는 버전은 3.4 (죽음) 및 3.5입니다.

py3.5와 Django 1.9를 사용하면 종료하려는 버전이 나올 때까지 한 번에 하나씩 업그레이드 할 수 있습니다. 예를 들어 Django 1.11은 py3.5 및 py3.7을 지원하므로

py27/dj19 -> py35/dj19 -> py35/dj1.11 -> py37/dj1.11 ... -> py37/dj2.2

dj2.2는 py3.8을 지원하는 첫 번째 버전이지만 일반적으로 보수적 인 환경에서 작업하는 경우 py37 / dj2.2에서 멈출 것입니다.

다른 패키지가있는 경우 각 단계에서 함께 작동하는 버전 조합을 찾아야합니다. 계획을 세우는 것이 중요하며 한 번에 하나의 구성 요소 만 업그레이드하면 시간이 절약됩니다.

미래의 라이브러리 ( https://python-future.org/ )는 py27과 3.x 모두에서 실행되는 코드가 필요하지만 많은 불안정한 상황에 도움이 될 것입니다. 여섯도 훌륭합니다. 나는 당신 자신의 호환성 레이어를 굴리는 것을 피할 것입니다 (왜 바퀴를 재발 명합니까?)

가능하면 시작하기 전에 단위 테스트 적용 범위를 최대 75-85 %로 설정하고 각 업그레이드 단계에 대해 "시작"및 "끝"버전 모두에 대해 자동 테스트를 설정하십시오. 다음 버전으로 업그레이드하기 전에 Django에서 모든 경고를 읽고 수정하십시오. Django는 이전 버전과의 호환성에 대해 거의 신경 쓰지 않으므로 일반적으로 업그레이드 경로에서 모든 부 버전을 누르는 것이 좋습니다 (또는 적어도 "뒤로" 비 호환성 "및 각 부 버전에 대한 사용 중단 목록).

행운을 빕니다 (현재 py27 / dj1.7에서 300 + Kloc 코드베이스를 업그레이드 중이므로 고통을 느낍니다 .-)


1
테스트 범위에 +1 그것은 어떤 접근 방식을 취하 든 여기에서 핵심 지표입니다. 광범위한 코드 변경을 실험 할 때 실제로 도움이되며 TDD Red / Green 테스트 애호가 가 아닌 사람이라고 말합니다 . 2.7 결과의 기준을 세우고 업그레이드가 훨씬 쉬워집니다.
JL Peyret

2

내 프로젝트와 같은 종류의 문제가 있으며 Django 버전 2.2.7로 Python 3.7.5를 시도했습니다.

python 최신 버전 3.8 또는 Django 최신 버전 3.0을 사용하면 어떤 종류의 버그에 대해서도 최신 버전에 대한 적절한 솔루션을 얻지 못할 가능성이 있기 때문에 안됩니다.


이것은 코멘트 여야합니다
Bruno

-2

현재 버전으로 촬영을 시도해야합니다. Python 3.8 및 Django 3.0. Six 라이브러리는 일부 규칙 변경에 도움이됩니다. 어느 쪽이든 리팩토링을 수행하여 최신 상태로 만들 수 있습니다.


3
Django 업그레이드를 해 본 적이 있습니까? 이것은 단지 희망적인 생각입니다. 2.7 / 1.9에서 Python 3.8 및 Django 3.0으로 직접 이동하는 것은 사실상 불가능합니다. Django 1.9에서 1.10으로의 마이너 버전을 업그레이드하는 것조차 많은 코드 변경이 필요한 어려운 프로세스 일 수 있습니다.
wim

예, 완전한 리팩토링을 수행하고 응용 프로그램을 최신 상태로 유지할 수있는 사치 및 시간 승인을 받았음을 인정했습니다. 응용 프로그램 크기, 논리 및 시간 제약 조건은 대부분의 사람들에게 큰 문제이지만 응용 프로그램 크기 또는 시간 제약 조건은 언급하지 않았으므로 "최고의 솔루션"또는 "소중한 사고"에 대한 의견을 추천했습니다.;)
Dave

또한 LTS Ubuntu에서 Ansible 및 실행 관련 사항에 대해 걱정해야하는 경우 Ubuntu 18.04에서는 3.7 지원도 부족합니다. 보안 팟 캐스트 필자는 3.8이 포인트 릴리스까지 또는 2.-1로 불필요하게 위험을 감수하게하는 것이 좋습니다.
JL Peyret 2012

좋은 보안 팟 캐스트 권장 사항이 있습니까?
Dave

파이썬 초, 들어 listennotes.com/podcasts/talk-python-to-me/... 하지만 내가 생각하는 조심-의-3.8-에 대한-A-중에 하나는 최근. Risky Business 는 국제 관계를 준수하는 경우 훌륭하고 재미있는 보안 팟 캐스트입니다. 공감에 대한 사과하지만, 귀하의 경우에 효과가 있었던 것은 다른 상황에서 다른 사람을 방해 할 수 있습니다. 2 변환 3을 참조 listennotes.com/podcasts/talk-python-to-me/...
JL Peyret
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.