[Linux] 레드햇 dnf 이용 python3.9 설치

Python 3

RHEL7에서 RHEL8 버전으로 넘어오면서 DNF에 module이라는 기능이 등장했습니다. 모듈 기능이 등장하면서 이제 하나의 OS 버전에서 dnf(yum) 명령어를 사용하여 여러 가지 특정 소프트웨어 제품의 다양한 버전을 관리할 수 있게 되었습니다. 이번 글에서는 dnf module 기능을 이용해서 python3.9 버전을 활성화하고 설치해 보도록 하겠습니다.

 

환경

RedHat Enterprise Linux 8 이상

 

사전 요구사항

  • 레드햇 시스템에 레포지토리가 구성되어 있어야 합니다.레포지토리 설정은 여기를 참조하실 수 있습니다.

 

Python3.9 설치

 

  • 현재 활성화 되어 있는 python 버전을 확인합니다.
    # dnf module list | grep ^python
    python27   2.7 [d]      common [d]                     Python programming language, version 2.7                                                                                                                                                                                         
    python36   3.6 [d][e]   build, common [d]              Python programming language, version 3.6                                                                                                                                                                                         
    python38   3.8 [d]      build, common [d]              Python programming language, version 3.8                                                                                                                                                                                         
    python39   3.9 [d]      build, common [d]              Python programming language, version 3.9
    
  • python3.9 버전을 설치합니다.
    # dnf module install python39
    Last metadata expiration check: 18:40:30 ago on Sun 01 Oct 2023 06:12:34 PM KST.
    Dependencies resolved.
    ==================================================================================================
     Package                                        Architecture                Version                                                   Repository                      Size
    ==================================================================================================
    Installing group/module packages:
     python39                                       x86_64                      3.9.2-1.module_el8.4.0+720+bfbc1bcb                       local-APP                       32 k
    Installing dependencies:
     python39-libs                                  x86_64                      3.9.2-1.module_el8.4.0+720+bfbc1bcb                       local-APP                      8.1 M
     python39-pip-wheel                             noarch                      20.2.4-3.module_el8.4.0+680+7b309a77                      local-APP                      1.3 M
     python39-setuptools-wheel                      noarch                      50.3.2-3.module_el8.4.0+680+7b309a77                      local-APP                      497 k
    Installing weak dependencies:
     python39-pip                                   noarch                      20.2.4-3.module_el8.4.0+680+7b309a77                      local-APP                      2.0 M
     python39-setuptools                            noarch                      50.3.2-3.module_el8.4.0+680+7b309a77                      local-APP                      871 k
    Installing module profiles:
     python39/common                                                                                                                                                          
    
    Transaction Summary
    ==================================================================================================
    Install  6 Packages
    
    Total download size: 13 M
    Installed size: 45 M
    Is this ok [y/N]: y
    ...
    
    Installed:
      python39-3.9.2-1.module_el8.4.0+720+bfbc1bcb.x86_64                               python39-libs-3.9.2-1.module_el8.4.0+720+bfbc1bcb.x86_64                               
      python39-pip-20.2.4-3.module_el8.4.0+680+7b309a77.noarch                          python39-pip-wheel-20.2.4-3.module_el8.4.0+680+7b309a77.noarch                         
      python39-setuptools-50.3.2-3.module_el8.4.0+680+7b309a77.noarch                   python39-setuptools-wheel-50.3.2-3.module_el8.4.0+680+7b309a77.noarch                  
    
    Complete!
    
  • 설치된 python 버전을 확인합니다.
    # python3.9 --version
    Python 3.9.2
    
    # dnf module list | grep ^python                                                                                                                                                                                    
    python27       2.7 [d]         common [d]                Python programming language, version 2.7                                                                                                                                                                                         
    python36       3.6 [d][e]      build, common [d]         Python programming language, version 3.6                                                                                                                                                                                         
    python38       3.8 [d]         build, common [d]         Python programming language, version 3.8                                                                                                                                                                                         
    python39       3.9 [d][e]      build, common [d] [i]     Python programming language, version 3.9
    

 

시스템 전역 명령어 등록

 

python3.9 설치 후 명령어 위치 분석

python3.9 버전을 설치했습니다. 해당 버전을 사용하기 위해 python3.9라는 명령어를 이용해야 하는데 python을 이용하는 프로그램에서 그냥 python3 명령어를 사용하는 경우가 있을 수 있습니다. 그렇게 되면 시스템에 python3.9 버전이 설치되어 있다 하여도 프로그램에서 사용하는 명령어는 python3.9 버전이 아닌 python3이기 때문에 이전 버전을 호출하게 되어 오류가 발생할 수 있습니다.

## python3 명령어 버전 정보 확인
# python3 --version
Python 3.6.8

## python3.9 명령어 버전 정보 확인
# python3.9 --version
Python 3.9.2

위와 같이 python3을 실행하면 기본적으로 설치된 python3.6을 호출합니다. 3.9버전 사용을 위해서는 python3.9라는 새로 생성된 명령어를 이용해야 합니다.

시스템 전역적으로 python3을 사용하게 되면 python3.9를 호출하도록 변경하기 위해 명령어 동작 원리를 보겠습니다. 먼저 python3 명령어를 살펴보면 /etc/alternatives/python3에 심볼릭 링크되어 있는 링크 파일인 부분을 확인할 수 있습니다.

# which python3
/usr/bin/python3

# ll /usr/bin/python3
lrwxrwxrwx. 1 root root 25 Oct 22  2022 /usr/bin/python3 -> /etc/alternatives/python3

그리고 다시 /etc/alternatives/python3 파일을 자세히 살펴보면 /usr/bin/python3.6에 링크된 링크 파일인 부분이 확인됩니다.

# ll /etc/alternatives/python3
lrwxrwxrwx. 1 root root 18 Oct  2 19:12 /etc/alternatives/python3 -> /usr/bin/python3.6

요약해 보면 우리가 호출한 python3 명령어는 아래와 같은 형태로 링크되어 있습니다.

/usr/bin/python3 -> /etc/alternatives/python3 -> /usr/bin/python3.6

/usr/bin/python3은 실제로는 /usr/bin/python3.6을 가리키고 있습니다. 이렇게 복잡하게 설정되어 있는 이유는 alternatives라는 기능을 이용해서 명령어를 관리하고 있기 때문입니다. 심볼릭 링크를 잘 아시는 분은 여기서 /usr/bin/python3 링크 파일을 /usr/bin/python3.9로 가리키면 쉽게 해결된다는 부분을 눈치채셨을 겁니다. 그렇게도 설정이 가능하지만 alternatives라는 기능을 이용해서 변경하는 방법을 보도록 하겠습니다.

 

alternatives가 관리하는 명령어 확인

alternatives –list 명령을 출력해 보면 alternatives 기능으로 제어할 수 있는 명령어 리스트들이 출력됩니다.

[root@node1 ~]# alternatives --list 
libnssckbi.so.x86_64  	auto  	/usr/lib64/pkcs11/p11-kit-trust.so
python                	manual	/usr/libexec/no-python
ifup                  	auto  	/usr/libexec/nm-ifup
ld                    	auto  	/usr/bin/ld.bfd
python3               	manual	/usr/bin/python3.6
print                 	auto  	/usr/bin/lpr.cups
cifs-idmap-plugin     	auto  	/usr/lib64/cifs-utils/cifs_idmap_sss.so
nmap                  	auto  	/usr/bin/ncat
xinputrc              	auto  	/etc/X11/xinit/xinput.d/ibus.conf
mkisofs               	auto  	/usr/bin/genisoimage
libwbclient.so.0.15-64	auto  	/usr/lib64/samba/wbclient/libwbclient.so.0.15
java                  	auto  	/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-4.el8.x86_64/jre/bin/java
jre_openjdk           	auto  	/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-4.el8.x86_64/jre
jre_1.8.0             	auto  	/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-4.el8.x86_64/jre
jre_1.8.0_openjdk     	auto  	/usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.282.b08-4.el8.x86_64
javac                 	auto  	/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-4.el8.x86_64/bin/javac
java_sdk_openjdk      	auto  	/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-4.el8.x86_64
java_sdk_1.8.0        	auto  	/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-4.el8.x86_64
java_sdk_1.8.0_openjdk	auto  	/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-4.el8.x86_64
mta                   	auto  	/usr/sbin/sendmail.postfix

출력 결과의 5번째 라인 python3를 보면 /usr/bin/python3.6 파일을 가리키는 걸 확인할 수 있습니다.

 

alternatives를 이용해 python3 명령어가 가르키는 파일 변경

alternatives –config 명령을 이용하여 python3이 가리키는 파일을 3.6버전이 아닌 3.9 버전으로 변경해 보겠습니다.

# alternatives --config python3

There are 2 programs which provide 'python3'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/python3.6
   2           /usr/bin/python3.9

Enter to keep the current selection[+], or type selection number: 2

“alternatives –config python3” 명령을 입력하면 python3 명령어로 사용할 파일을 선택할 수 있는 화면이 나타납니다. 현재 “+” 항목이 1번을 가리키고 있는 것으로 확인됩니다. 여기서 2번을 입력하고 엔터를 치면 명령어가 /usr/bin/python3.9로 변경됩니다.

“alternatives –config python3” 명령을 다시 실행해서 정보를 확인해 보면 2번 앞에 “+”기호가 붙은 걸 볼 수 있습니다. 여기서 변경 없이 저장하려면 엔터 버튼 눌러서 종료하시면 됩니다.

# alternatives --config python3

There are 2 programs which provide 'python3'.

  Selection    Command
-----------------------------------------------
*  1           /usr/bin/python3.6
 + 2           /usr/bin/python3.9

Enter to keep the current selection[+], or type selection number:

다시 python3 명령어로 버전 정보를 확인해 보면 python3.9 버전이 사용되는 걸 확인할 수 있습니다.

# python3 --version
Python 3.9.2

마치며

레드햇 레포에서 제공하는 python3.9 버전을 설치했습니다. 또한 alternatives 명령을 이용해 시스템 전역적으로 python3 명령어 사용 시에 우리가 설치한 python3.9 버전을 가리키도록 변경해 보았습니다. alternatives 명령은 python 명령어 외에 oracle java 명령어 설치 후 등록할 때 가끔(대부분 PATH 설정 사용) 활용되는 기술이므로 알고 계시면 트러블슈팅에 유용합니다.

 

참고

https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/assembly_installing-and-using-python_configuring-basic-system-settings https://www.server-world.info/en/note?os=CentOS_Stream_8&p=python&f=5

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top