Python PermissionError : [WinError 32] 프로세스가 파일에 액세스 할 수 없습니다 ..... 내 파일이 닫혔습니다.

줄리안 드라고

SQLite .db 파일을 만든 다음 .sql 스크립트를 실행하여 TRANSACTIONS해당 db 내 에서 테이블을 초기화하는 Python 프로그램이 있습니다. 내 디자인의 일환으로 TRANSACTIONS테이블 생성에 실패한 경우 불완전한 데이터베이스가 남지 않도록 .db 자체를 삭제하고 싶습니다.

내 문제는 .db 파일을 삭제하려고 할 때 os.remove(db_path).db 파일이 다른 프로세스에서 사용 중이라는 Win32 오류가 발생한다는 것입니다. 이 과정이 무엇인지 알 수 없습니다.

내 모듈 initialize_db.py:

import sqlite3 as sql
import os

class initialize_db:

    # Parameters are Path objects of where to create the DB, 
    # and where to find the DB initialization script
    def __init__(self, db_path, init_script_path):
        self.db_path = db_path
        self.init_script_path = init_script_path

        try:
            self.cursor = self.create_db()
            self.initialize_transactions()
        # If an exception is raised, delete the entire database
        except ValueError:
            print('Error encountered, DB not created')
            self.cursor.close()
            os.remove(db_path)  # This is causing the issue
            raise

    def create_db(self):
        '''Creates .db database at self.db_path'''
        conn = sql.connect(self.db_path)
        print('creating database')
        return conn.cursor()

    def initialize_transactions(self):
        '''Initializes the TRANSACTIONS table within the database'''
        with open(self.init_script_path, 'r') as init_script:
            sql_script = init_script.read()

        raise ValueError  # Raise this before executing sql script as a test

        self.cursor.execute(sql_script)

        print('initialization script executed')

initialize_transactions()내 .db가 내에서 제대로 삭제되었는지 테스트하기 위해 의도적으로 ValueError 를 발생 __init__()시킵니다. 이것을 실행하면 다음을 얻습니다.

from initialize_db import initialize_db
initialize_db(my_db_path, my_db_script_path)

역 추적 (가장 최근 호출 마지막) :

...

파일 "C : \ some_database_path \ initialize_db.py", 26 행, init

os.remove (db_path)

PermissionError : [WinError 32] 다른 프로세스에서 사용 중이므로 프로세스가 파일에 액세스 할 수 없습니다 : 'C : \ some_database_path \ database.db'

따라서 기본적으로 내 프로그램은 내 데이터베이스를 생성하지만 예외가 발생하면 제대로 삭제하지 않습니다. db_path내 프로그램이 거기에 도착할 때까지 어떤 프로세스가 사용되는지에 대한 생각 이 있습니까? 커서뿐만 아니라 Path 개체를 닫아야하는지 조사했지만 둘 다 작동하지 않는 것 같습니다.

dcg

문제는 자신의 프로세스가 데이터베이스에 대한 핸들이 있기 때문에 데이터베이스를 삭제할 수 없다는 것입니다. 다음 conn과 같이 저장하십시오 .

self.conn = sql.connect(self.db_path)

그런 다음 except절에서 커서를 닫은 후 연결을 닫고 파일을 삭제하십시오.

self.cursor.close()
self.conn.close()
os.remove(db_path)

도움이 되었기를 바랍니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관