ubuntu에서 apt-get으로 python3.7, pip 설치 및 심볼릭 링크 설정하기

2022. 1. 22. 15:11[개발] 지식/Python

ubuntu-16.04 버전에서는 기본적으로 python 3.5가 설치되어 있다. 이번에 하려는 작업은python3.7(또는 다른 버전)을 설치하고 이를 python, pip 명령어를 통해 실행할 수 있게끔 설치&세팅 하는 것이다.

python 설치

먼저 apt-get을 최신화 한다.

$ sudo apt-get update

Repository를 추가할 수 있는 패키지를 설치한다.

$ sudo apt install software-properties-common

Repository를 등록하고, 다시 apt-get을 최신화한다.

$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update

Python3.7을 설치한다.

$ apt-get install python3.7

설치된 것을 확인한다. /usr/bin 경로로 들어가서 현재 설치된 python을 살펴보면:

$ ls -al /usr/bin/python*

아래와 같은 식으로 설치되어 있을 것이다. 3.5는 OS에서 기본적으로 설치되어 있던 python이고, 3.7은 방금 설치한 python이다.

/usr/bin/python3 -> python.3.5
/usr/bin/python3.5
/usr/bin/python3.5m
/usr/bin/python3.7
/usr/bin/python3.7m
...

그런데 현재 python3이 python3.5를 가리키도록 심볼릭 링크가 설정되어 있다. python3 명령어를 실행하면 python3.5가 실행된다는 의미이다. 나의 목적은 python 명령어를 실행했을 때, python3.7이 실행되는 것이므로 심볼릭 링크를 아래와 같이 설정한다.

$ ln -s /usr/bin/python3.7 /usr/bin/python

참고로 /usr/bin은 기본적으로 PATH에 설정되어 있기 때문에, 별도의 PATH 설정 없이도 해당 디렉토리의 명령어에 바로 접근이 가능하다. 아래 명령어를 입력하여 3.7 버전이 출력되는지 확인한다.

$ python -V

또는

$ python --version

pip 설치

python은 가상환경을 만들어서 해당 가상환경 내에서 python과 pip를 사용하는 것이 권장된다. 따라서 전역적으로 실행할 수 있는 pip라는 것은 큰 의미가 없다. 하지만 상황적인 이유로 비개발자가 쉽게 접근이 가능하도록 세팅을 해야할 필요가 있었기 때문에 이런 작업을 하게 되었다.

따라서 가상환경을 생성해서 사용하는 것을 권장하고, 본 글에서 하는 것처럼 pip를 전역으로 세팅하는 것은 권장하지 않는다.

1. python3-pip 설치 (비권장)

※ 이번 섹션은 시행착오의 기록이기 때문에 불필요하므로, 설치 방법만 알기를 원한다면 2번으로 넘어가면 된다.

윈도우의 경우 python을 설치하면 해당 버전에 맞는 pip가 같이 설치된다. 반면 리눅스에서는 pip를 입력해도 명령어를 찾지 못했다. 찾아보니 python3-pip 패키지를 설치하면 된다고 한다. (python2의 경우는 python-pip를 python3 부터는 python3-pip)

$ apt-get install python3-pip

그런데 예상치 못하게도 python3.6이 함께 설치되었다. 이유는 리눅스에서 설치할 수 있는 python3-pip 패키지가 python3.6 기반으로 실행되기 때문이다.

일단 /usr/bin 경로에서 pip를 찾아보면 pip3가 설치되어 있는것을 확인할 수 있다.

$ ls -al /usr/bin/python*
/usr/bin/pip3

python과 마찬가지로 심볼릭 링크를 설정했다.

ln -s /usr/bin/pip3 /usr/bin/pip

그리고 아래 명령어를 실행하여, 확인을 해보니..

pip -V
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

python 3.6과 연결되어 있으며, dist-packages 경로가 python3.6도 아니고, python3 디렉토리로 별도 설정되었다.

의문점이 생겨 조금 찾아보니.. /usr/bin에 있는 pip3는 python 패키지 관리자에 의해 관리되는 패키지가 아닌 ubuntu 패키지이다. 따라서 python-numpy 처럼 pip로 설치되는 패키지가 아니기 때문에 필요한 특정 python 버전도 함께 설치될 수 있다.

참고

  • /usr/lib/python3/dist-packages contains non-host-specific modules installed by the system with the package manager, for example on Ubuntu with sudo apt-get python-numpy.
  • /usr/local/lib/python3.6/dist-packages contains modules that you installed yourself system-wide through a package manager, for example with sudo pip install numpy. (Of cause using sudo pip can cause problems as you rightly mentioned.)
  • /home/twotwo/.local/lib/python3.6/site-packages contains modules that the user twotwo has installed in his own user directory, for example by using pip in user-mode. Those modules can of cause only be imported by twotwo, because they don't appear in other user's PATH variables and might not even be readable by another user.

The reason cause different location of python packages

먼저 업그레이드를 시도해보았다.

$ pip3 install --upgrade pip
Cache entry deserialization failed, entry ignored
Collecting pip
  Cache entry deserialization failed, entry ignored
  Downloading https://files.pythonhosted.org/packages/a4/6d/6463d49a933f547439d6b5b98b46af8742cc03ae83543e4d7688c2420f8b/pip-21.3.1-py3-none-any.whl (1.7MB)
    100% |████████████████████████████████| 1.7MB 398kB/s
Installing collected packages: pip
  Found existing installation: pip 9.0.1
    Not uninstalling pip at /usr/lib/python3/dist-packages, outside environment /usr
Successfully installed pip-21.3.1

그리고 다시 버전을 확인하니..

pip3 -V
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 21.3.1 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

잉... 실행은 되는데 저런 WARNING이 자꾸 뜬다. Python에 내장된 pip를 사용하는 것을 권장하고 있다. 그리고 이번에는 dist-packages 경로가 python3.6 디렉토리에 있다. 뭔가 이상하다. 아래 문구가 좀 걸리는데 뭔가 꼬인게 아닐까 한다.

Not uninstalling pip at /usr/lib/python3/dist-packages, outside environment /usr
Successfully installed pip-21.3.1

--force-reinstall 옵션을 추가하여, 강제로 재설치를 했다.

root@projooni-vm-0:/usr/bin# ./pip3 install --upgrade --force-reinstall pip
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
Collecting pip
  Using cached pip-21.3.1-py3-none-any.whl (1.7 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 21.3.1
    Uninstalling pip-21.3.1:
      Successfully uninstalled pip-21.3.1
Successfully installed pip-21.3.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

기존 pip3가 삭제된듯 하다. /usr/bin에서 사라졌다. 그리고.. /usr/local/bin에 pip가 새로 설치되었다. 아래 명령어로 검색하면 3가지의 pip가 나온다.

$ ls -al /usr/local/bin/pip*
pip
pip3
pip3.6

세 개 모두 python 3.6 버전을 가리킨다. --force-reinstall 옵션으로 다시 업그레이드(재설치) 했더니, 기존 /usr/bin/pip3를 지워버리고 /usr/local/bin에 새로 설치를 한 것이었다.

2. 버전별 내장 pip 업그레이드

python3.4 버전부터는 python 바이너리에 pip가 내장되어 있다고 한다. 아래와 같이 실행하면 python3.7 버전의 pip 버전을 확인할 수 있다.

python -m pip -V

혹시 위의 명령어를 실행했을 때 pip를 찾지 못한다면 1번 항목을 수행하고 다시 시도하면 될 것이다. 업그레이드를 위해 아래 명령어를 실행한다.

python -m pip install --upgrade --force-reinstall pip

/usr/local/bin에 pip가 설치된 것을 확인할 수 있다.

pip
pip3
pip3.6
pip3.7

혹시 설치를 했는데 pip를 실행했을 때 3.7버전의 pip가 실행되지 않는다면, 아래 명령어를 통해 hash 테이블에 저장된 PATH 정보를 초기화해보자.

hash -r

Reference

pip가 안될 경우 (-bash: /usr/bin/pip: No such file or directory로 나올 경우)

우분투에서 pip3가 동작하지 않을 때

<