python在windows上非阻塞读取文件

标签 python windows windows-7

我在 Windows (Win7) 上有一个程序,每 x 秒写入一个 txt 文件。 现在我有一个 python 脚本,每 x 秒读取一次这个 txt 文件。 当 python 脚本读取文件并且同时另一个程序想要写入该文件时 - 写入程序崩溃(并显示权限错误)。由于我无法修改程序写入 txt 文件的方式,因此我必须尝试在不阻止写入程序的情况下打开 txt 文件。 有人知道在这种情况下我能做什么吗(无障碍阅读) 我会很高兴收到有关此主题的每条提示!

尝试读取文件的程序代码如下所示:

    with codecs.open(datapath, "r", 'utf-16') as raw_data:

         raw_data_x = raw_data.readlines()

我必须用“编解码器”打开文件,因为它是 unicode。

最佳答案

很长一段时间后,我设法在 ctypes 中创建了一个函数来为您完成它。请记住,这仅在进程未获得“独占”访问权限时才有效。如果是这样,那你就倒霉了,需要使用如图所示的卷影复制服务 here或实现 here .
不管怎样,给你:

import ctypes
from ctypes import wintypes
import os
import msvcrt

GENERIC_READ = 0x80000000
GENERIC_WRITE = 0x40000000

OPEN_EXISTING = 3
OPEN_ALWAYS = 4

ACCESS_MODES = {
    "r": GENERIC_READ,
    "w": GENERIC_WRITE,
    "r+": (GENERIC_READ|GENERIC_WRITE)
}

OPEN_MODES = {
    "r": OPEN_EXISTING,
    "w": OPEN_ALWAYS,
    "r+": OPEN_ALWAYS,
}


def open_file_nonblocking(filename, access):
    # Removes the b for binary access.
    internal_access = access.replace("b", "")
    access_mode = ACCESS_MODES[internal_access]
    open_mode = OPEN_MODES[internal_access]
    handle = wintypes.HANDLE(ctypes.windll.kernel32.CreateFileW(
        wintypes.LPWSTR(filename),
        wintypes.DWORD(access_mode),
        wintypes.DWORD(2|1),  # File share read and write
        ctypes.c_void_p(0),
        wintypes.DWORD(open_mode),
        wintypes.DWORD(0),
        wintypes.HANDLE(0)
    ))

    try:
        fd = msvcrt.open_osfhandle(handle.value, 0)
    except OverflowError as exc:
        # Python 3.X
        raise OSError("Failed to open file.") from None
        # Python 2
        # raise OSError("Failed to open file.")

    return os.fdopen(fd, access)

该函数在共享读写句柄的同时打开文件,允许多次访问。然后它将句柄转换为普通的 Python 文件对象。
确保在完成后关闭文件。

关于python在windows上非阻塞读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36163715/

相关文章:

windows - 如何在 Windows 中获取批处理脚本的路径?

windows-7 - WiX msi 自定义操作无法在 Windows 7 上以有限权限运行

windows - UDP 监听套接字在网络配置更改后停止监听

python - 将数据从字典加载到 MultiIndex Dataframe

python - 将包含日期时间对象的元组转换为 numpy 结构化数组时出现 `TypeError: float() argument must be a string or a number`

c# - Windows Metro 应用程序 - 为我的 UI 制作动画?

windows - Docker容器正在运行,但浏览器拒绝连接

Java 文件 IO 和 "access denied"错误

python - 模块未找到错误 : No module named 'tensorflow_docs' when creating TensorFlow docs

python - 迭代器 vs 生成器 vs 可迭代对象