[python] Python 메이저 버전 업그레이드 후 패키지를 가상 환경으로 자동 재설치

venvPython 3.6 모듈 로 만든 디스크에 여러 가상 환경 (수십)이 있습니다. 이제 서둘러 우분투 19.10으로 업그레이드 한 후에야 일반적으로 인정되는 소스에서 우분투 19.10에 3.6을 전혀 사용할 수 없음을 알았습니다. 필자는 홈 디렉토리 아래 에 있고 포함 폴더에서 실행 하여 이러한 가상 환경 의 Python 버전 을 업그레이드했습니다 .bin/python3python3.7 -mvenv --upgrade

이제 python3.7 -mvenv --upgrade가상 환경에서 Python 을 업그레이드하는 동안 lib/python3.7/site-packages아래의 이전 패키지 버전을 다시 설치하는 것은 아무 것도 없습니다 venv. 필자는 Python 3.6을 설치 pip freeze하고 요구 사항을 충족시킨 venv다음 venv를 Python 3.7로 업그레이드 하여이 작업을 수행 할 수 있다고 생각 pip install -r합니다 . 새로운 OS에 Python 3.6 설치 만 사용할 수 있다면 .

소스에서 Python 3.6을 설치하거나 conda를 사용하거나 임의의 PPA에서 3.6을 설치하지 않고도 다소 자동화 된 방식으로 (아마도 pip freeze이전 lib/python3.6디렉토리를 사용하는 ) 다른 방법이 있습니까? 모든 환경을 대량으로 업그레이드하여 나중에 임의의 환경에서 무언가를해야 할 때 Python 3.7과 계속 작동하도록하고 싶습니다.



답변

새 3.7 venv에서는 pkg_resources사용 가능 해야합니다 setuptools. 작성시 자동으로 설치됩니다. 그렇지 않다면 그냥 pip install setuptools.

setuptools라이브러리 코드는 실제로 pip벤더가 만드는 pip freeze것입니다. 그러나 수동으로 고정시킬 수 있습니다.

# in 3.7 runtime...
import pkg_resources
old_site_dir = ".venv/lib/python3.6/site-packages/"
working_set = pkg_resources.WorkingSet([old_site_dir])
for dist in working_set:
    print(dist.as_requirement())

해당 출력을 requirements.txt파일 에 던질 수 있으며 재건축 된 사이트가있을 수 있습니다.python3.6 런타임이 필요 .

이 방법은 프로젝트가 배포 메타 데이터에 환경 마커 를 사용하여 python3.6 및 python3.7에 대해 별도의 종속성 트리를 선언 할 수 있기 때문에 100 % 완전하지 않을 수 있습니다 ( PEP 508 참조 ). 3.6 사이트에 설치된 항목이 3.7 을 전혀 지원하지 않을 수도 있습니다 . 그러나 3.6에서 3.7 사이의 부 버전 범프에서는 실제로 작업 세트를 사용하는 것만으로도 “충분히”우수하다는 것을 알 수 있습니다.


답변