Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

명령줄 언어로 Bash 대신 Python 활용하기: 완벽 가이드

저는 bash와 애증 관계입니다. 터미널에서 많은 시간을 보내다 보니 어느새 bash가 저의 기본 '프로그래밍 언어'가 되었습니다. 가끔 사람들에게 find, grep, xargs가 인프라를 실제로 운영하고 있다고 말하면, 제가 진지하다는 걸 깨닫기 전까지 웃어넘기곤 합니다.

시스템 관리자에게 Python은 완벽한 선택입니다. 터미널에서 작업해야 하지만 bash를 쓰고 싶지 않거나, bash로는 감당하기 너무 복잡한 작업이 필요한 모든 분들에게도 유용합니다. 작업이 다음 수준을 넘어선다면...

find $(pwd) -name "*.txt" | xargs -I {} echo "do stuff with {}"

이제 Python을 꺼낼 때입니다!

Python을 주력 명령줄 언어로 사용하면 얻을 수 있는 장점은 무척 많습니다.

  • 풍부한 라이브러리: 거의 모든 작업을 도와주는 훌륭한 라이브러리가 있습니다. 시스템 운영, 파일 읽기, 디렉터리 목록 조회, 반복문 작성, 종료 코드 확인 등이 모두 포함됩니다.
  • IDE 자동완성: 무언가를 통째로 외워야 할 필요가 있을까요? 자동완성이 해결해 줍니다.
  • 강력한 테스트 스위트: 아직 테스트를 작성하지 않는다면, 시작하기 좋은 계기가 될 것입니다.
  • iPython 콘솔: 정말 환상적입니다. 놀라울 정도로요. 제가 정말 사랑하는 기능입니다.
  • 높은 접근성: 대부분의 시스템에 Python이 설치되어 있으며, 없더라도 Miniconda로 손쉽게 설치할 수 있습니다.
  • 견고한 오류 처리: try/except 블록으로 안정적인 오류 검사가 가능합니다.
  • 크로스 플랫폼 지원: 여러 운영체제에서 작업한다면 Python 라이브러리가 내부적으로 차이를 모두 처리해 줍니다.
  • 쉬운 학습 곡선: 프로그래밍 경험이 전혀 없어도 Python은 시작하기 쉬운 언어입니다.

시작하기

시작하려면 먼저 Python이 설치되어 있거나 Miniconda로 설치해야 합니다.

iPython 설치 여부 확인

which python
which ipython

두 명령이 모두 성공하면 준비가 된 것입니다! Python은 있는데 iPython이 없다면 설치가 필요합니다. 시스템 패키지로 설치할 수도 있지만, Miniconda로 설치하는 것을 권장합니다.

Miniconda 설치

OS에 맞는 설치 파일을 받으세요. Python 3 버전을 권장합니다.

설치 과정은 간단합니다.

bash Miniconda3-latest-Linux-x86_64.sh

안내에 따라 진행하면 Miniconda3가 설치됩니다. 설치 후에는 업데이트를 실행하세요. 기술 분야에서는 늘 최신 상태를 유지해야 하니까요. ;-)

conda update conda
conda config --add channels conda-forge
conda update -y --all
conda install -y ipython

문제 해결

패키지 설치에 문제가 있다면 다음 팁을 참고하세요.

  • conda clean --all을 실행한 후 다시 시도합니다.
  • 올바른 채널을 사용하고 있는지 확인합니다.
  • conda update -y --all을 실행합니다.
  • 전역 conda 공간에는 최소한만 설치하고, 대신 작업과 프로젝트별로 별도의 환경을 만드세요. 다음 섹션에서 자세히 다룹니다.

Conda로 환경 만들기

virtualenv, pipenv, Rbenv, plenv, anyenv 등 수년간 등장한 다양한 env 도구를 사용해 본 적이 있다면 매우 익숙하게 느껴질 겁니다. 핵심 개념은 프로젝트마다 독립된 소프트웨어 환경을 가져야 한다는 것입니다.

conda create -n my-project ipython package1 package2 package2

저처럼 iPython을 언제든 사용할 수 있기를 원한다면, 새 환경을 만들 때마다 꼭 함께 설치하세요!

시스템 관리용 Python 라이브러리

예제로 들어가기 전에 유용한 패키지들을 문서와 함께 정리해 보겠습니다.

제가 가장 즐겨 쓰는 패키지는 os입니다. 디렉터리 목록 조회, 파일 존재 여부 확인, 심볼릭 링크 확인, 디렉터리 생성, 시스템 명령 실행, 환경 변수 가져오기 및 설정 등 다양한 작업에 활용할 수 있습니다. 정말 훌륭합니다!

두 번째는 subprocess 모듈입니다. Python 라이브러리로 제공되지 않는 시스템 명령을 실행할 때 사용합니다.

shutil은 os 라이브러리에 없는 파일 작업들을 담당합니다.

pprint 라이브러리는 복잡한 데이터 구조를 보기 좋게 들여쓰기하여 출력해 줍니다.

pytest 라이브러리는 Python 코드를 테스트할 수 있게 해줍니다. 솔직히 말해서, 처음(혹은 몇 번)에 제대로 동작하는 코드는 드물기 때문입니다.

코드 실행 방법

드디어 코드입니다!

명령줄 언어로 Bash 대신 Python 활용하기: 완벽 가이드

Python으로 시스템 관리를 할 때는 iPython 콘솔에 바로 들어가거나, 스크립트를 작성한 후 python name-of-script.py로 실행하면 됩니다.

스크립트 작성을 선호한다면 선택지가 무척 많습니다. 결국 개인 취향의 문제입니다. 저는 유료인 PyCharm을 사용하지만, Visual Studio Code와 Atom도 훌륭한 무료 대안입니다.

작업 내용에 따라 달라지는데, 가끔은 그냥 iPython 콘솔을 열고 바로 타이핑을 시작하기도 하고, 테스트 등이 필요한 더 견고한 구조가 요구될 때도 있습니다.

iPython 콘솔이나 위에서 언급한 에디터 중 하나를 사용하면 자동완성 기능을 활용할 수 있습니다. 자동완성은 정말 훌륭합니다! iPython에서 함수 이름을 조금 입력한 후 Tab 키를 누르면 원하는 함수 후보 목록이 나타납니다.

명령줄 언어로 Bash 대신 Python 활용하기: 완벽 가이드

자동완성을 얼마나 사랑하는지 말로 다 표현할 수 없습니다. ;-)

도움말 얻기

각 라이브러리의 문서 페이지를 직접 찾아갈 수도 있지만, 라이브러리나 함수 이름을 알고 있다면 iPython에서 바로 확인할 수 있습니다.

명령줄 언어로 Bash 대신 Python 활용하기: 완벽 가이드

명령줄 언어로 Bash 대신 Python 활용하기: 완벽 가이드

대부분의 IDE와 텍스트 편집기에서도 도움말 메뉴를 열 수 있지만, 이는 사용하는 에디터마다 다릅니다.

예제

먼저 필요한 패키지를 임포트합니다.

import os
import subprocess
import shutil
from pprint import pprint

다음은 자주 사용되는 파일 및 디렉터리 작업 예제입니다.

# 현재 작업 디렉터리 가져오기
# 문자열을 반환합니다
my_cwd = os.getcwd()
print(my_cwd)
# 디렉터리 내용 목록 조회
# 리스트를 반환합니다
dir_list = os.listdir()
for item in dir_list:
    print(item)
# 파일의 절대 경로 이름 가져오기 (파일 + 현재 작업 디렉터리)
os.path.abspath('some-file')
# basename 가져오기 - 파일명을 반환합니다
os.path.basename('/path/to/file')
# 디렉터리 경로 분할 - 플랫폼 독립적
os.path.split(os.getcwd())
# Out[17]: ('/Users', 'jillian')
# 경로 존재 여부 확인
os.path.exists('/path/on/filesystem')
# 경로가 심볼릭 링크인지 확인
os.path.islink()

파일과 디렉터리를 옮기는 방법입니다.

# 디렉터리 복사
# cp -rf에 해당
shutil.copytree('src', 'dest')
# 파일 복사
shutil.copyfile('file1', 'file2')
# 디렉터리 이동
# mv에 해당
shutil.move('src', 'dest')

모든 작업이 Python 라이브러리로 제공되는 것은 아닙니다. 예를 들어 시스템 라이브러리 설치 같은 경우에는 시스템 명령을 직접 실행해야 합니다!

# 임의의 시스템 명령 실행
command = "echo 'hello'"
result = subprocess.run(command.split(' '), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# stdout과 stderr 출력
print(result.stdout)
print(result.stderr)

파일에 쓰기도 가능합니다!

# 파일에 쓰기 (파일이 없으면 생성)
# echo "hello" > hello.txt에 해당
f= open("hello.txt","w+")
f.write("hello!")
f.close()
# 파일에 내용 추가
# echo "hello" >> hello.txt에 해당
f = open("hello.txt", "a+")
f.write("hello again!")
f.close()

테스트 작성하기!

테스트는 주로 assert라는 함수를 사용해 작동합니다. 이는 '이것이 참인지 확인하고, 아니라면 큰 소리로 실패하라'는 의미입니다.

def test_system_command():
    """시스템 명령의 종료 코드 테스트"""
    command = "echo 'hello'"
    result = subprocess.run(command.split(' '), stdout=subprocess.PIPE)
    assert result.returncode == 0

이 함수를 test_my_code.py라는 파일에 저장하고 pytest test_my_code.py로 실행하세요.

마무리

지금까지 Python을 bash 대체 도구로 활용하기 위한 핵심 팁과 요령을 살펴봤습니다. 다음에 bash에서 반복문을 작성해야 하는 순간이 온다면, iPython 콘솔을 열어 어떤 대안을 만들 수 있는지 직접 확인해 보세요!