【发布时间】:2019-06-06 08:04:35
【问题描述】:
如果我运行下面的脚本,它会抛出显示的错误。但是,如果我切换终端并运行相同的命令来删除文件 (os.remove("test.db")),则会删除该文件。
import gc
import os
import time
from sqlite3 import connect
from contextlib import contextmanager
file = "test.db"
@contextmanager
def temptable(cur: object):
cur.execute("create table points(x, int, y int)")
try:
yield
finally:
cur.execute("drop table points")
with connect(file) as conn:
cur = conn.cursor()
with temptable(cur=cur):
cur.execute("insert into points (x, y) values(1, 1)")
cur.execute("insert into points (x, y) values(1, 2)")
cur.execute("insert into points (x, y) values(2, 1)")
for row in cur.execute("select x, y from points"):
print(row)
for row in cur.execute("select sum(x * y) from points"):
print(row)
os.remove(file)
文件“c:\Users\You_A\Desktop\2019Coding\context_generator_decorator.py”,第 32 行,在 os.remove(文件) PermissionError: [WinError 32] 进程无法访问该文件,因为它正被另一个进程使用:'test.db'
同样,在任何终端中运行 os.remove("test.db") 会成功删除文件。
【问题讨论】:
-
您已经在使用该文件
-
你在过程中哪里提到了
os.remove("test.db")的使用? -
我不知道你的意图,但如果它是关于暂时使用 SQLite3 而不将任何结果保存到文件中,你可以使用
:memory:而不是文件名。另外,如果要删除整个文件,为什么要DROP TABLE?另外,一个INSERT就足够了:cur.execute("insert into points (x, y) values(1, 1),(1, 2),(2, 1)") -
@tonypdmtr 只是想弄清楚上下文管理器、装饰器和生成器