폴더 지우기 - os.rmdir, os.system, shutil.rmtree

폴더를 지워야 할 때

자동화 스크립트를 적다보면 폴더를 생성하고 지워야할 때가 있다.

예를 들어,

  • 특정 버전의 라이브러리 소스코드를 인터넷에서 땡겨온다
  • 해당 소스코드 기반으로 라이브러리를 빌드 한다
  • 빌드 후, 원본 소스코드를 포함하는 폴더를 삭제한다.

방법 1: os.system

작업중인 OS에서 지원하는 폴더 삭제 명령을 파이썬 명령어를 통해 입력하는 방법이다.

가장 간단한 방법이다.

Ubuntu Linux 등에서 관리자 권한으로 폴더를 지울 때는 sudo를 입력해야할 때가 있는데, 이럴 때는 사전에 sudo 권한을 켜두면 좋다. Docker에서는 자동으로 관리자 권한이라 좀 더 편하긴 하다.

아래 코드에는 내가 좋아하는 패스워드 모듈을 함께 첨부했다. 이 모듈은 argparse를 통해 스크립트 실행 시 커맨드라인에 패스워드를 입력해서 sudo 권한을 매번 자동으로 입력하게 해주는 모듈이다. (물론 보안 상 엄청 안 좋은 방법이지만, 가장 쉬운 방법 중 하나이다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import os
import argparse

class Password:
def __init__(self, password):
self.data = password

def sudo(self):
if self.data == "":
return "sudo "

return "echo " + self.data + " | sudo -S "


def main():
parser = argparse.ArgumentParser(
description='sample script')
parser.add_argument('--password', metavar='\b', type=str, default="",
help='Provide your Linux password to avoid manually typing in your password for every auto internal \'sudo\' command usage. This will leave traces of your password in your shell history. If you are concerned about security, do not use this option.')

global pw
pw = Password(args.password)

# ... some code

folder_path = "~/directory/to/some/path"
os.system(pw.sudo() + "rm -rf " + folder_path)

방법 2: shutil.rmtree

크로스플랫폼 지원이 되는 방법이다.

사실 위 방법보다 이게 좀 더 좋은듯?

ignore_errors 옵션을 넣으면 폴더가 없을 때도 삭제할 수 있다.

1
2
3
import shutil

shutil.rmtree('~/folder', ignore_errors=True)

방법 3: os.rmdir

아무 내용이 없는 빈 폴더를 지울 때만 사용 가능하다.

개인적으로 아직 실제로 써본 적은 없는듯