하얀설표 블로그




파이썬 모든 모듈(패키지)을 업그레이드하는 코드 만들기(upgrade all python packages)





( 수정됨)


코드

다음은 "pip list" 명령시 조회되는 설치된 파이썬 패키지를 "python -m pip {package} --upgrade" 명령을 통해 최신 버전으로 업그레이드하는 코드이다.

# pkg_up.py by 하얀설표
import os
import sys
import pkg_resources
def main():
    os.system(f'"{sys.executable}" -m pip install --upgrade pip')
    list_package = [i for i in pkg_resources.working_set]
    # white.seolpyo.com/
    for n, package in enumerate(list_package, 1):
        print()
        print(f'({n}/{len(list_package)})')
        print(f'{package.key=}')
        print(f'{package.version=}')
        os.system(f'"{sys.executable}" -m pip install {package.key} --upgrade')

if __name__ == '__main__':
    key = ''
    while key not in {'y', 'n'}:
        key = input(f"""\
파이썬 환경 : {sys.prefix}
파이썬 경로 : {sys.executable}
{'*' * 30}
위 설정을 기준으로 파이썬 패키지를 업그레이드합니다.
가상환경의 패키지를 업그레이드하려면 가상환경에서 실행해야 합니다.
위 설정이 맞으면 y, 아니면 n을 입력해주세요.
(y / n) : \
""").lower()
    if key == 'y':
        main()
    elif key == 'n':
        print('작업을 수행하려는 환경에서 실행해주세요.')

실행 예시

윈도우

(pip) C:\seolpyo>pip install requests==2.0.0
(pip) C:\seolpyo>pip install beautifulsoup4==4.1.0
(pip) C:\seolpyo>pip list
Package        Version
-------------- -------
beautifulsoup4 4.1.0
pip            22.3.1
requests       2.0.0
setuptools     65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.1.2
[notice] To update, run: python.exe -m pip install --upgrade pip

(pip) C:\seolpyo>pip -V
pip 22.3.1 from C:\seolpyo\pip\Lib\site-packages\pip (python 3.11)

(pip) C:\seolpyo>python pkg_up.py
파이썬 환경 : C:\seolpyo\pip
파이썬 경로 : C:\seolpyo\pip\Scripts\python.exe
******************************
위 설정을 기준으로 파이썬 패키지를 업그레이드합니다.
가상환경의 패키지를 업그레이드하려면 가상환경에서 실행해야 합니다.
위 설정이 맞으면 y, 아니면 n을 입력해주세요.
(y / n) : y
Requirement already satisfied: pip in c:\seolpyo\pip\lib\site-packages (22.3.1)
Collecting pip
  Using cached pip-23.1.2-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.3.1
    Uninstalling pip-22.3.1:
      Successfully uninstalled pip-22.3.1
Successfully installed pip-23.1.2

(1/4)
package.key='setuptools'
package.version='65.5.0'
Requirement already satisfied: setuptools in c:\seolpyo\pip\lib\site-packages (65.5.0)
Collecting setuptools
  Downloading setuptools-68.0.0-py3-none-any.whl (804 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 804.0/804.0 kB 10.2 MB/s eta 0:00:00
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 65.5.0
    Uninstalling setuptools-65.5.0:
      Successfully uninstalled setuptools-65.5.0
Successfully installed setuptools-68.0.0

(2/4)
package.key='pip'
package.version='22.3.1'
Requirement already satisfied: pip in c:\seolpyo\pip\lib\site-packages (23.1.2)

(3/4)
package.key='beautifulsoup4'
package.version='4.1.0'
Requirement already satisfied: beautifulsoup4 in c:\seolpyo\pip\lib\site-packages (4.1.0)
Collecting beautifulsoup4
  Using cached beautifulsoup4-4.12.2-py3-none-any.whl (142 kB)
Collecting soupsieve>1.2 (from beautifulsoup4)
  Using cached soupsieve-2.4.1-py3-none-any.whl (36 kB)
Installing collected packages: soupsieve, beautifulsoup4
  Attempting uninstall: beautifulsoup4
    Found existing installation: beautifulsoup4 4.1.0
    Uninstalling beautifulsoup4-4.1.0:
      Successfully uninstalled beautifulsoup4-4.1.0
Successfully installed beautifulsoup4-4.12.2 soupsieve-2.4.1

(4/4)
package.key='requests'
package.version='2.0.0'
Requirement already satisfied: requests in c:\seolpyo\pip\lib\site-packages (2.0.0)
Collecting requests
  Using cached requests-2.31.0-py3-none-any.whl (62 kB)
Collecting charset-normalizer<4,>=2 (from requests)
  Using cached charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl (96 kB)
Collecting idna<4,>=2.5 (from requests)
  Using cached idna-3.4-py3-none-any.whl (61 kB)
Collecting urllib3<3,>=1.21.1 (from requests)
  Using cached urllib3-2.0.3-py3-none-any.whl (123 kB)
Collecting certifi>=2017.4.17 (from requests)
  Using cached certifi-2023.5.7-py3-none-any.whl (156 kB)
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
  Attempting uninstall: requests
    Found existing installation: requests 2.0.0
    Uninstalling requests-2.0.0:
      Successfully uninstalled requests-2.0.0
Successfully installed certifi-2023.5.7 charset-normalizer-3.2.0 idna-3.4 requests-2.31.0 urllib3-2.0.3

(pip) C:\seolpyo>pip list
Package            Version
------------------ --------
beautifulsoup4     4.12.2
certifi            2023.5.7
charset-normalizer 3.2.0
idna               3.4
pip                23.1.2
requests           2.31.0
setuptools         68.0.0
soupsieve          2.4.1
urllib3            2.0.3

리눅스

(pip) $ pip list
Package        Version
-------------- -------
beautifulsoup4 4.1.0
pip            20.3.4
pkg-resources  0.0.0
requests       2.0.0
setuptools     44.1.1
(pip) $ python pkg_up.py
파이썬 환경 : ~/pip
파이썬 경로 : ~/pip/bin/python
******************************
위 설정을 기준으로 파이썬 패키지를 업그레이드합니다.
가상환경의 패키지를 업그레이드하려면 가상환경에서 실행해야 합니다.
위 설정이 맞으면 y, 아니면 n을 입력해주세요.
(y / n) : y
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: pip in ./pip/lib/python3.9/site-packages (20.3.4)
Collecting pip
  Downloading https://www.piwheels.org/simple/pip/pip-23.1.2-py3-none-any.whl (2.1 MB)
     |████████████████████████████████| 2.1 MB 302 kB/s 
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 20.3.4
    Uninstalling pip-20.3.4:
      Successfully uninstalled pip-20.3.4
Successfully installed pip-23.1.2

(1/5)
package.key='setuptools'
package.version='44.1.1'
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: setuptools in ./pip/lib/python3.9/site-packages (44.1.1)
Collecting setuptools
  Downloading https://www.piwheels.org/simple/setuptools/setuptools-68.0.0-py3-none-any.whl (804 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 804.0/804.0 kB 489.0 kB/s eta 0:00:00
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 44.1.1
    Uninstalling setuptools-44.1.1:
      Successfully uninstalled setuptools-44.1.1
Successfully installed setuptools-68.0.0

(2/5)
package.key='requests'
package.version='2.0.0'
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: requests in ./pip/lib/python3.9/site-packages (2.0.0)
Collecting requests
  Downloading https://www.piwheels.org/simple/requests/requests-2.31.0-py3-none-any.whl (62 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.6/62.6 kB 101.6 kB/s eta 0:00:00
Collecting charset-normalizer<4,>=2 (from requests)
  Downloading charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (198 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 198.2/198.2 kB 2.0 MB/s eta 0:00:00
Collecting idna<4,>=2.5 (from requests)
  Using cached https://www.piwheels.org/simple/idna/idna-3.4-py3-none-any.whl (61 kB)
Collecting urllib3<3,>=1.21.1 (from requests)
  Downloading https://www.piwheels.org/simple/urllib3/urllib3-2.0.3-py3-none-any.whl (123 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 123.6/123.6 kB 208.3 kB/s eta 0:00:00
Collecting certifi>=2017.4.17 (from requests)
  Downloading https://www.piwheels.org/simple/certifi/certifi-2023.5.7-py3-none-any.whl (156 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 156.9/156.9 kB 274.0 kB/s eta 0:00:00
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
  Attempting uninstall: requests
    Found existing installation: requests 2.0.0
    Uninstalling requests-2.0.0:
      Successfully uninstalled requests-2.0.0
Successfully installed certifi-2023.5.7 charset-normalizer-3.2.0 idna-3.4 requests-2.31.0 urllib3-2.0.3

(3/5)
package.key='pkg-resources'
package.version='0.0.0'
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: pkg-resources in ./pip/lib/python3.9/site-packages (0.0.0)

(4/5)
package.key='pip'
package.version='20.3.4'
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: pip in ./pip/lib/python3.9/site-packages (23.1.2)

(5/5)
package.key='beautifulsoup4'
package.version='4.1.0'
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: beautifulsoup4 in ./pip/lib/python3.9/site-packages (4.1.0)
Collecting beautifulsoup4
  Downloading https://www.piwheels.org/simple/beautifulsoup4/beautifulsoup4-4.12.2-py3-none-any.whl (142 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 143.0/143.0 kB 248.5 kB/s eta 0:00:00
Collecting soupsieve>1.2 (from beautifulsoup4)
  Downloading https://www.piwheels.org/simple/soupsieve/soupsieve-2.4.1-py3-none-any.whl (36 kB)
Installing collected packages: soupsieve, beautifulsoup4
  Attempting uninstall: beautifulsoup4
    Found existing installation: beautifulsoup4 4.1.0
    Uninstalling beautifulsoup4-4.1.0:
      Successfully uninstalled beautifulsoup4-4.1.0
Successfully installed beautifulsoup4-4.12.2 soupsieve-2.4.1
(pip) $ pip list
Package            Version
------------------ --------
beautifulsoup4     4.12.2
certifi            2023.5.7
charset-normalizer 3.2.0
idna               3.4
pip                23.1.2
pkg_resources      0.0.0
requests           2.31.0
setuptools         68.0.0
soupsieve          2.4.1
urllib3            2.0.3

설명

가상환경에서 실행하는 방법

코드가 실행되는 환경에 따라 패키지가 업그레이드되는 환경이 달라진다.
가상환경을 실행하지 않더라도 가상환경에 설치된 패키지 업그레이드가 가능하긴 하지만,
환경과 경로가 가상환경이 아닌 일반 환경으로 나온다면 가상환경을 activate한 다음 실행하면 될 것이다.

파이썬 가상환경 생성과 실행방법은 이 글에서 확인할 수 있다.

일반환경에서 실행하는 경우

& "C:/Program Files/Python311/python.exe" c:/seolpyo/example.py
파이썬 환경 : C:\Program Files\Python311
파이썬 경로 : C:\Program Files\Python311\python.exe
******************************
위 설정을 기준으로 파이썬 패키지를 업그레이드합니다.
가상환경의 패키지를 업그레이드하려면 가상환경에서 실행해야 합니다.
위 설정이 맞으면 y, 아니면 n을 입력해주세요.
(y / n) : n
작업을 수행하려는 환경에서 실행해주세요.

가상환경에서 실행하는 경우

(pip) C:\seolpyo>python pkg_up.py
파이썬 환경 : C:\seolpyo\pip
파이썬 경로 : C:\seolpyo\pip\Scripts\python.exe
******************************
위 설정을 기준으로 파이썬 패키지를 업그레이드합니다.
가상환경의 패키지를 업그레이드하려면 가상환경에서 실행해야 합니다.
위 설정이 맞으면 y, 아니면 n을 입력해주세요.
(y / n) : n
작업을 수행하려는 환경에서 실행해주세요.

일반환경에서 가상환경 파이썬으로 실행하는 경우

& c:/seolpyo/pip/Scripts/python.exe c:/seolpyo/example.py
파이썬 환경 : C:\seolpyo\pip
파이썬 경로 : C:\seolpyo\pip\Scripts\python.exe
******************************
위 설정을 기준으로 파이썬 패키지를 업그레이드합니다.
가상환경의 패키지를 업그레이드하려면 가상환경에서 실행해야 합니다.
위 설정이 맞으면 y, 아니면 n을 입력해주세요.
(y / n) : n
작업을 수행하려는 환경에서 실행해주세요.

사용한 명령어 설명

sys.prefix

실행 중인 파이썬의 환경을 출력하는 명령이다.
가상환경에서 이 명령어를 실행하면 가상환경 폴더의 경로가 출력된다.

sys.executable

python 명령으로 실행되는 파이썬의 절대 경로를 출력하는 명령이다.

sys.prefix와 마찬가지로 가상환경 실행 중일 때와 아닐 때 출력되는 결과물이 다르다.
코드가 가상환경에서도 정상적인 작동하기 위해 반드시 필요한 명령어다.

sys.executable을 쌍따옴표로 감싸는 이유

터미널에 입력하는 코드를 보면 다음과 같이 쌍따옴표로 감싸여 있다.
"{sys.executable}"

이는 파이썬 경로에 공백이 있을 경우의 대비책이다.
윈도우의 경우 가상환경이 아닌 일반 환경에는 보통 C:\Program Files 폴더에 설치되는데, 이 경우 명령어 중간에 공백이 들어가게 된다.
명령어 중간에 공백이 존재하면 분리된 명령어로 인식하기 때문에 이 문제를 방지하기 위해 쌍따옴표로 명령어를 감싸 공백이 있지만 1개의 명령어라고 컴퓨터에게 알려줘야 한다.

그렇지 않을 경우 다음과 같은 에러가 발생하게 된다.

$ C:\Program Files\Python311\python.exe -m pip install requests --upgrade
'C:\Program'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.

os.system

코드에서 시스템 터미널에 명령어를 실행할 수 있도록 해주는 명령이다.
이 명령을 통해 "{절대경로}/python.exe -m pip pinstall {패키지명} --upgrade" 명령어를 입력해 실행시킨다.

pkg_resources.working_set

파이썬에 설치된 패키지를 가져오는 제너레이터이다.

DeprecationWarning: pkg_resources is deprecated as an API.

코드 실행시 다음과 같은 문구가 출력될 수 있는데, https://setuptools.pypa.io/en/latest/pkg_resources.html에 방문하라는 안내 문구다.

$ python pkg_up.py
C:\seolpyo\pkg_up.py:2: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
  import pkg_resources


공감 : 0







white.seolpyo.com