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

 


RHEL8부터 도입된 DNF 모듈 기능을 활용해 Python 3.9 버전을 설치하고, 시스템 전역에서 사용할 수 있도록 설정하는 방법을 설명합니다.


DNF 모듈 기능 개요

RHEL7에서 RHEL8으로 넘어오면서 dnf에는 module이라는 기능이 새롭게 추가되었습니다. 이 기능을 통해 동일한 OS 버전 내에서도 여러 소프트웨어의 다양한 버전을 선택적으로 설치하고 관리할 수 있게 되었습니다. 이번 글에서는 이 기능을 활용하여 Python 3.9 버전을 설치하고 활성화하는 방법을 설명합니다.

 

환경

  • 대상 OS: Red Hat Enterprise Linux 8 이상

  • 사전 조건: 시스템에 레포지토리가 설정되어 있어야 하며, 구성 방법은 LOCAL REPO를 참조하시기 바랍니다.


Python3.9 설치

 현재 시스템에 활성화되어 있는 Python 모듈을 먼저 확인합니다. 다음 명령어를 실행하면 Python 2.7부터 3.9까지의 모듈 목록을 확인할 수 있으며, 현재 활성화된 버전은 [e]로 표시됩니다.

    # 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
이제 Python 3.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!
    
설치가 완료되면 python3.9 --version 명령어로 정상 설치 여부를 확인할 수 있습니다.
    # 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 설치 후 명령어 위치 분석

Python 3.9를 설치한 후 python3.9 명령어로 호출할 수 있지만, 일반적으로 많은 프로그램은 python3 명령어를 사용합니다. 시스템 전역적으로 python3이 Python 3.9를 가리키도록 설정을 변경해야 합니다.

## 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로 관리되는 항목들을 확인할 수 있습니다. 이 중 python3 항목이 /usr/bin/python3.6을 가리키고 있는 것도 확인할 수 있습니다.

[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

 

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

이제 alternatives --config python3 명령어를 사용하여 python3이 가리키는 경로를 Python 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

2번을 선택하면 python3 명령어는 이제 Python 3.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 명령어가 변경된 경로를 제대로 반영하는지 확인합니다. --version 옵션을 이용하면 현재 python3 명령어가 어떤 버전을 실행하고 있는지 알 수 있습니다.

# python3 --version
Python 3.9.2
이 출력 결과를 통해 시스템에서 기본적으로 사용되는 python3 명령어가 이제 Python 3.9 버전을 가리키고 있다는 것을 확인할 수 있습니다.

마치며

레드햇 레포지토리를 통해 제공되는 Python 3.9 버전을 설치하고, 시스템 기본 명령어인 python3가 해당 버전을 가리키도록 변경하는 방법을 살펴봤습니다. 이를 통해 특정 버전의 파이썬을 요구하는 환경에서 유연하게 대처할 수 있습니다.

또한, alternatives 명령은 Python 외에도 Java 같은 다른 패키지에서 종종 사용되며, 명령어 충돌이나 경로 문제 발생 시 유용하게 활용할 수 있는 기능입니다. 시스템 설정의 안정성과 일관성을 유지하기 위해 꼭 알고 있어야 할 도구입니다.

 

참고

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

댓글

이 블로그의 인기 게시물

[Linux] RHEL Local YUM Repository 구성

[Linux Command] sudo command 설명

[Ansible Modules] Fetch module 설명 및 활용