首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python在windows上非阻塞读取文件

python在windows上非阻塞读取文件
EN

Stack Overflow用户
提问于 2016-03-23 03:42:33
回答 2查看 3.2K关注 0票数 9

我有一个在windows (Win7)上的程序员,它每隔x秒写入一个txt文件。现在我有了一个python脚本,它每隔x秒读取一次这个txt文件。当python脚本读取文件,同时另一个程序想要写入该文件时-写入程序崩溃(并显示权限错误)。因为我不能修改程序写入txt文件的方式,所以我必须尝试打开txt文件而不阻止写入程序。有没有人知道在这种情况下我可以做什么(阅读而不阻塞),我会非常高兴每一个关于这个话题的技巧!

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

代码语言:javascript
运行
复制
    with codecs.open(datapath, "r", 'utf-16') as raw_data:

         raw_data_x = raw_data.readlines()

我必须打开与“编解码器”的文件,因为它在unicode。

EN

Stack Overflow用户

发布于 2016-03-24 07:07:11

在很长一段时间之后,我设法创建了一个在ctype中为您完成此任务的函数。请记住,只有当进程没有获得“独占”访问权限时,这才会起作用。如果是这样的话,你就不走运了,需要使用像shown here或implemented here这样的卷影复制服务。

不管怎样,这就是你的想法:

代码语言:javascript
运行
复制
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文件对象。

完成后请确保关闭该文件。

票数 7
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36163715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档