규도자 개발 블로그

CentOS로 Python3.x쓰기 및 yum에러 해결 본문

Python/Python

CentOS로 Python3.x쓰기 및 yum에러 해결

규도자 (gyudoza) 2018. 11. 14. 23:18

CentOS로 Python3.x쓰기 및 yum에러 해결

CentOS에 기본적으로 설치돼있는 파이썬의 버전은 2.x대이다. 하지만 파이썬은 2버전과 3버전으로 나뉘어져있는 데다가 2버전은 곧 지원이 끊긴다. 심지어 아주 기본적인 문법에서부터 차이가 있어서 2.x에서 작성된 소스를 3.x으로 돌리면 제대로 돌아가지 않는 경우가 왕왕 있다. 하지만 파이썬 3.x가 필요하다면 어떻게든 설치해서 사용해야 한다.

 굳이 CentOS뿐만 아니라 Fedora, Redhat계열 리눅스에서 통용되는 방법이다.

ius Repository를 yum에 추가한다.

$ yum install -y https://centos7.iuscommunity.org/ius-release.rpm

python3로 시작하는 라이브러리들을 확인한다.

$ yum search python3

필요한 python 패키지 및 라이브러리를 설치한다. (3.6버전을 기준으로 작성해놨지만 현재는 3.71버전까지 나온 상태이다. 해당 Repository가 업데이트되면 마음에 드는 버전을 설치하도록 하자.)

$ yum install -y python36u python36u-libs python36u-devel python36u-pip

설치된 파이썬 버전을 확인한다.

$ python -V
Python 2.7.5
$ python3 -V
Python 3.6.4

이제 python3가 설치되었으니 python3인터프리터를 사용할 수 있다. 하지만 그냥 python이라는 명령어를 쓰면 2.x의 인터프리터가 실행된다. 그냥 python이라는 명령어를 실행했을 때 python3.x를 실행하고 싶다면 python이라는 명령어에 설정돼있는 python2.x의 symlink를 python3.x로 바꿔주면 된다.

$ which python3.6
/usr/bin/python3.6

해당 명령어는 python3.6 인터프리터가 있는 곳을 찾는다. 하지만 which또한 패키지 명령어이니 실행되지 않는다면 yum -y install which명령어를 실행하여 which를 설치하도록 하자.

symlink를 수정하도록 하자.

$ unlink /bin/python
$ ln -s /bin/python3.6 /bin/python3
$ sudo ln -s /bin/python3.6 /bin/python
$ ln -s /bin/pip3.6 /bin/pip

이렇게 하면 그냥 python 명령어를 실행했을 때 python3.x가 실행된다.

하지만 그냥 이렇게 두면 크고작은 문제가 발생한다. 페도라, 레드헷계열 리눅스 자체가 python2.x인터프리터 언어로 작성된 프로그램이 많기 때문이다. 대표적으로 yum자체도 python2.x로 작성되었다. 그래서 이렇게 symlink를 수정한 뒤에 yum 명령어를 실행하다보면 이런저런 에러들이 발생한다.

 대표적으로 아래 에러들이 있다. yum search package명령어를 실행해보자.

$ yum search package
  File "/usr/bin/yum", line 30
    except KeyboardInterrupt, e:
                            ^
SyntaxError: invalid syntax

이런 에러가 발생한다. yum이 python2.x로 작성돼있기 때문이다. 이 에러는 이렇게 해결할 수 있다.

$ vim /usr/bin/yum

을 열고 맨 위에 적혀있는 다음 경로를 아래와 같이 수정한다.

#!/usr/bin/python
==>
#!/usr/bin/python2.7

하지만 이게 끝이 아니다. yum의 작동에는 이상이 없으나 패키지를 다운받을 때 문제가 발생한다.

Downloading packages:
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
                  ^
SyntaxError: invalid syntax
Exiting on user cancel

이 에러는 아래 명령어를 실행함으로써 해결할 수 있다.

$ vim /usr/libexec/urlgrabber-ext-down

명령어를 통해 다운받을 때 url을 설정하는 파일을 수정하자. 이 라인 또한 맨 위에 적혀있다.

#!/usr/bin/python
==>
#!/usr/bin/python2.7

이렇게 하면 정상적으로 yum명령어들을 실행할 수 있다.


결론

조금 김새는 이야기지만 굳이 python명령어 경로를 변경해서 쓰지 않는게 좋다. 이렇게 장황하게 써놓고 왜 하지 말라고 하는 거냐면 위 내용에서도 짐작할 수 있다시피 기본 python명령어로 실행하는 인터프리터를 변경하면 내부적으로 어떤 문제가 발생할지 모른다. 특히 CentOS의 전신인 레드햇계열 리눅스는 알다시피 굉장히 폐쇄적인 정책을 취하고 있고 이 '폐쇄적'이라는 단어는 곧 '자신들에게 검증된'것만 쓴다는 말이다. 기본적으로 깔려있는 yum이 python2.x를 상정하고 명령어들이 짜여져있다면 분명 yum뿐만이 아닌 다른 내장패키지들도 python2.x로 작성돼있을 것이고, 이는 나중에 잠재적인 에러를 야기할 수 있다. 그러니 불편해도 굳이 symlink를 변경하지 않고 python은 python으로, python3.x는 python3라는 명령어로 사용하는 것을 권고한다.

Comments