문제

Python으로 작성된 일반 목적 최종 사용자 유틸리티를 개발했다고 가정 해 봅시다. 이전에는 버전 2.3보다 후반에 파이썬에 적합한 버전 하나만 사용 가능했습니다. "필요한 경우 파이썬을 다운로드 한 다음이 스크립트를 실행하십시오"라고 말하는 것이 충분했습니다. 소스 컨트롤에는 스크립트의 한 버전 만 있었으며 (GIT를 사용하고 있습니다) 추적을 유지했습니다.

Python 3의 경우 더 이상 반드시 사실은 아닙니다. 예측 가능한 미래를 위해, 나는 파이썬 2.X에 적합한 두 가지 버전과 Python 3.X에 적합한 두 가지 버전을 동시에 개발해야합니다. 개발 관점에서 볼 때 몇 가지 옵션을 생각할 수 있습니다.

  1. 동일한 분기에 두 개의 다른 스크립트를 유지하여 동시에 둘 다를 개선합니다.
  2. 두 개의 별도 지점을 유지하고 개발이 진행됨에 따라 일반적인 변화를 앞뒤로 병합하십시오.
  3. 한 버전의 스크립트를 유지하고 스크립트를 한 버전에서 다른 버전으로 변환하는 패치 파일을 확인하십시오. 패치가 더 이상 깨끗하게 적용되지 않도록 충분한 변경이 이루어지면 충돌을 해결하고 새 패치를 만듭니다.

처음 두 개는 많은 오류가 발생하기 쉬운 지막을 포함하기 때문에 현재 옵션 3에 기대고 있습니다. 그러나 옵션 3은 지저분 해 보이고 내 소스 제어 시스템은 나를 위해 패치를 관리해야합니다.

배포 포장의 경우 더 많은 옵션을 선택할 수 있습니다.

  1. Python 2에 적합한 두 가지 다운로드 패키지와 Python 3에 적합한 두 가지 다운로드 패키지를 제공합니다 (사용자는 Python 버전에 대해 올바른 것을 다운로드해야합니다).
  2. 내부에 두 개의 다른 스크립트가있는 하나의 다운로드 패키지를 제공합니다 (그리고 사용자는 올바른 스크립트를 실행하기 위해 알아야합니다).
  3. 두 개의 버전 특정 스크립트가 장착 된 하나의 다운로드 패키지와 두 파이썬 버전으로 실행될 수있는 작은 스터브 로더로 설치된 Python 버전의 올바른 스크립트를 실행합니다.

다시 한 번 나는 여기에서 옵션 3에 기대고 있지만 아직도 스터브 로더를 개발하려고 시도하지는 않았습니다.

다른 아이디어가 있습니까?

도움이 되었습니까?

해결책

편집하다: 원래 답변은 2009 년 주를 기반으로했으며 Python 2.6과 3.0은 현재 버전으로 사용되었습니다. 이제 Python 2.7 및 3.3의 경우 다른 옵션이 있습니다. 특히, 이제 Python 2 및 Python 3에 단일 코드베이스를 사용하는 것이 가능합니다.

보다 Python 2 코드 포팅 Python 3

원래 답변 :

그만큼 공식 추천 말 :

기존 Python 2.5 또는 2.6 소스 코드를 Python 3.0으로 포팅하려면 가장 좋은 전략은 다음과 같습니다.

  1. (전제 조건 :) 우수한 테스트 범위로 시작합니다.

  2. 포트에서 파이썬 2.6. 이것은 Python 2.x에서 Python 2까지의 평균 포트보다 더 이상 작동하지 않아야합니다 (x+1). 모든 테스트가 통과해야합니다.

  3. (여전히 2.6을 사용하고 있습니다 :) -3 명령 줄 스위치를 켭니다. 이를 통해 3.0에서 제거 (또는 변경) 할 기능에 대한 경고가 가능합니다. 테스트 스위트를 다시 실행하고 경고가 남지 않을 때까지 경고를받는 코드를 수정하십시오. 모든 테스트가 여전히 통과하십시오.

  4. 소스 코드 트리를 통해 2to3 소스 간 소스 번역기를 실행하십시오. 이 도구에 대한 자세한 내용은 2To3- 자동화 된 Python 2 ~ 3 코드 변환을 참조하십시오.) Python 3.0에서 번역 결과를 실행하십시오. 남은 문제를 수동으로 수정하여 모든 테스트가 다시 통과 될 때까지 문제를 해결하십시오.

Python 2.6 및 3.0에서 변경되지 않은 소스 코드를 작성하는 것이 좋습니다. 인쇄문, 메타 클래스 등을 피하는 매우 뒤틀린 코딩 스타일을 사용해야합니다. Python 2.6과 Python 3.0을 모두 지원 해야하는 라이브러리를 유지하는 경우 3.0 버전의 소스 코드를 편집하고 2to3 번역기를 다시 실행하여 위의 3 단계를 수정하는 것이 가장 좋습니다. 소스 코드.

이상적으로는 단일 버전으로, 즉 2.6과 호환되며 2to3를 사용하여 3.0으로 번역 할 수 있습니다. 실제로이 목표를 완전히 달성하지 못할 수도 있습니다. 따라서 3.0 미만으로 작동하려면 수동 수정이 필요할 수 있습니다.

옵션 2와 같이 분기에서 이러한 수정을 유지합니다. 그러나이 분기에서 최종 3.0 호환 버전을 유지하기보다는 수동 수정을 적용하는 것이 좋습니다. ~ 전에 2To3 번역을 하고이 수정 된 2.6 코드를 지점에 넣습니다. 이 방법의 장점은이 분기와 2.6 트렁크의 차이가 다소 작으며 2to3의 변경 사항이 아니라 수동 변경으로 만 구성된다는 것입니다. 이런 식으로 별도의 지점은 유지 관리 및 병합이 쉬워야하며, 향후 2To3의 향후 개선으로부터 혜택을 볼 수 있어야합니다.

또는 약간의 "기다리고"접근 방식을 취하십시오. 단일 2.6 버전과 2To3 번역으로 갈 수있는 한 포트를 진행하고 실제로 3.0 버전이 필요할 때까지 나머지 수동 수정을 연기하십시오. 어쩌면이 시간까지 더 이상 수동 조정이 필요하지 않습니다 ...

다른 팁

개발을 위해 옵션 3은 너무 번거 롭습니다. VCSES마다 다를 수는 있지만 두 가지 가지를 유지하는 것이 가장 쉬운 방법입니다. 많은 DVC는 별도의 저장소 (병합을 돕기위한 공통 조상이 포함 된)로 더 행복 할 것이며 중앙 집중식 VC는 두 개의 지점에서 작업하기가 더 쉬울 것입니다. 옵션 1이 가능하지만 병합 할 무언가와 오류가 발생하기 쉬운 IMO를 놓칠 수 있습니다.

배포하려면 가능한 경우 옵션 3도 사용합니다. 어쨌든 3 가지 옵션은 모두 유효 하며이 모델에 대한 변형을 때때로 보았습니다.

나는이 길을 전혀 가져갈 것이라고 생각하지 않습니다. 당신이 그것을 바라 보는 방법은 고통 스럽습니다. 실제로, 두 버전을 동시에 유지하는 데 큰 상업적 관심이 없다면, 이것은 이득보다 더 두통입니다.

적어도 몇 달 동안 최대 1 년 동안 2.x를 계속 발전시키는 것이 더 합리적이라고 생각합니다. 어느 시점에서 2.x에 대한 최종 안정적인 버전을 선언하고 3.x+에 대한 다음 버전을 개발할 시간입니다.

예를 들어, 주요 프레임 워크 중 일부가 PYQT, MATPLOTLIB, NUMPTY 및 일부 주요 프레임 워크가 진행될 때까지 3.X로 전환하지 않습니다. 그리고 어느 시점에서 그들이 2.x 지원을 중단하고 3.x를 위해 개발을 시작한다면 정말 신경 쓰지 않습니다. 짧은 시간에 3.x로 전환 할 수 있다는 것을 알기 때문입니다.

Python 3.0에 매우 가깝습니다. 2.6으로 마이그레이션하는 것으로 시작합니다. Python 3.0에 더 가까워 질 2.7을 기다릴 수도 있습니다.

그런 다음 2.6 (또는 2.7)으로 마이그레이션 한 후에는 "If Py3k : ... Else : ..."와 같은 것들이있는 스크립트의 버전을 단순히 보관하는 것이 좋습니다. 필수적인. 물론 개발자가 쓰기를 좋아하는 코드의 종류는 아니지만 여러 스크립트 나 분기 또는 패치 또는 배포판을 관리하는 것에 대해 걱정할 필요가 없습니다.

무엇을 선택하든 100% 코드 커버리지로 철저한 테스트가 있는지 확인하십시오.

행운을 빕니다!

개발을위한 옵션이 선택 되든, 대부분의 잠재적 인 문제는 철저한 단위 테스트로 완화 될 수있어 두 버전이 일치하는 출력을 생성 할 수 있습니다. 즉, 옵션 2는 나에게 가장 자연스럽게 보입니다. 하나의 소스 트리에서 다른 소스 트리로 변경 사항을 적용하는 것은 작업 (대부분) 버전 제어 시스템이 설계되었습니다.

개발을 위해서는 '청중을 알지 못한다'고 말하기가 어렵습니다. Power Python 사용자는 아마도 소프트웨어의 두 부를 다운로드 할 필요가 없지만 더 일반적인 사용자 기반을 위해 '그냥 작동'할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top