gpt4 book ai didi

python - 关闭文件以便我可以在 Windows 上用 Python 删除它?

转载 作者:可可西里 更新时间:2023-11-01 09:37:15 25 4
gpt4 key购买 nike

假设您有一个 python 模块 black_box,您将其导入到 python 脚本中。您向此模块 black_box 传递一个文件路径,如下所示:

import black_box
import os

file_path = r"C:\foo.txt"
black_box.do_something(file_path)
os.remove(file_path)

有时 black_box 模块会打开该文件并使其保持打开状态,但我需要删除 black_box 已打开的文件。

我在 Windows 上收到一条错误消息:

WindowsError: [Error 32] The process cannot access the file because it is being used by another process: C:\foo.txt

如何关闭文件以便删除它?

我无法更改 black_box 模块。

我没有 black_box 创建的文件处理程序。

black_box 不提供 away 关闭文件。

最佳答案

如果 black_box 只是调用 open(file_path, mode) 而没有进一步处理 file_path 本身,你可以自己打开文件并传递一个文件描述符:

black_box.do_something(open(file_path, mode).fileno())

如果可行,您可以在变量“file”中捕获 open() 的结果,当 do_something() 返回时,您可以只测试“file.closed”并在需要时调用“file.close()” , 在删除文件之前。

如果此时您不走运,并假设实际打开文件的 black_box 部分是用 Python 编写的,您还可以使用 monkeypatch builtin.open 或 os.open。由于您知道文件名,拦截函数会检查文件名,如果不匹配则简单地调用原始函数。当 black_box 打开文件时,您自己恢复 BufferedReader(或其他 Reader 对象),并用您自己的方法替换 'closed()' 方法。

低级 os.open 函数的稍微复杂的拦截看起来像这样,但你不能指望 builtin.open 实际调用 os.open,你必须通过实验找出 black_box 如何打开文件。

import os    
real_open = os.open
real_close = os.close
FILENAME = "your file path"
SAVED_FD = None

def my_open(filename, flags, mode, *, dir_fd = None):
if filename != FILENAME:
return real_open(filename, flags, mode, dir_fd=dir_fd)
fd = real_open(filename, flags, mode, dir_fd=dir_fd)
SAVED_FD = fd
return fd


import black_box
black_box.do_something(FILENAME)
if SAVED_FD is not None:
try:
os.close(SAVED_FD)
except OSError: # Bad file descriptor
pass

当然,所有大写的全局变量都可以是局部变量,或者您可以在更复杂的情况下使用上下文变量。

关于python - 关闭文件以便我可以在 Windows 上用 Python 删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com