2014-01-21 4 views
3

파일을 등록하는 방법이 있습니까? 파이썬이 종료 될 때 파일이 종료되는 방법에 관계없이 삭제되도록하려면 어떻게해야합니까? 수명이 긴 임시 파일을 사용하고 있으며 파일을 정리하고 싶습니다.프로그램을 종료 할 때 파일을 제거하는 방법?

파일 이름이 있어야하며 가능한 한 빨리 원래 핸들을 닫아야합니다. 수천 개가 생성되어 정상 파일로만 존재하는지 확인해야합니다.

+0

나는 이것이 어떤 의미인지 잘 모르겠다. 이 임시 파일을 왜 사용하고 있습니까? 또한, "정상적인 파일로만 존재하는 것"은 무엇을 의미합니까? – wdh

+0

파일을 사용하여 프로그램의 여러 부분간에 (겉으로보기) 데이터를 전달하는 이유는 무엇입니까? – sapi

+1

@sapi : 여러 종류의 외부 코드 나 프로세스를 위해 temp 디렉토리를 사용합니다.하지만 여러 파일을 생성해야하지만 정리하고 싶습니다. 어쨌든 의미있는 사용 사례가 있습니다. –

답변

8

tempfile module; 그것은 자동 삭제하는 임시 파일을 만듭니다. tempfile.NamedTemporaryFile() documentation에서

:이 true (디폴트)의 삭제 경우

, 파일을 즉시 닫을으로 삭제됩니다.

이러한 파일 객체를 컨텍스트 관리자로 사용하면 코드 블록이 종료 될 때 자동으로 닫히게되거나 인터프리터가 종료 될 때 닫히게 할 수 있습니다.

대체 방법으로 tempdir.mkdtemp()이라는 전용 임시 디렉토리를 만들고 프로그램 완료시 전체 디렉토리를 삭제하려면 shutil.rmtree()을 사용하십시오.

바람직하게는, 다른 컨텍스트 관리자와 후자를 수행

import shutil 
import sys 
import tempfile 

from contextlib import contextmanager 


@contextmanager 
def tempdir(): 
    path = tempfile.mkdtemp() 
    try: 
     yield path 
    finally: 
     try: 
      shutil.rmtree(path) 
     except IOError: 
      sys.stderr.write('Failed to clean up temp dir {}'.format(path)) 

등이 사용

with tempdir() as base_dir: 
    # main program storing new files in base_dir 

# directory cleaned up here 

당신은atexit hook function이 작업을 수행 할 수도 있지만 상황에 맞는 관리자가 있습니다 많이 청소기 접근.

+0

나는 그 기능을 사용하고있다. 그러나 "close = on"파일을 삭제하고 싶지 않기 때문에 "delete = False"로 설정했다. 나는이 지점을 넘어 존재하는 이름이 프로그램의 다른 부분에서 사용되기를 원합니다. –

+0

@ edA-qamort-ora-y : 그러면 닫을 필요가 없습니다. –

+0

나는이 질문을 분명히했으나 본질적으로 파일이 많기 때문에 파일을 열어 둘 수는 없다. –

0

atexit library을 사용할 수는 있지만이 모듈을 통해 등록 된 함수는 Python에서 처리하지 않는 신호에 의해 프로그램이 중단되거나 Python의 치명적인 내부 오류가 감지되거나 os ._exit()가 호출됩니다. 하지만 순수한 파이썬에서 이러한 문제를 처리 할 수있는 것은 없다고 생각합니다.

this question

관련 문제