栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何创建一个可由子进程读取的临时文件?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何创建一个可由子进程读取的临时文件?

至少如果您使用现有的Python库打开一个临时文件,则在Windows中无法从多个进程访问该文件。根据MSDN,您可以指定第三个参数(

dwSharedMode
)共享模式标志
FILE_SHARE_READ
以使其
CreateFile()
起作用:

在文件或设备上启用后续打开操作,以请求读取访问权限。否则,其他进程如果请求读取访问权限,则无法打开文件或设备。如果未指定此标志,但是已打开文件或设备以进行读取访问,则该功能将失败。

因此,您可以编写Windows特定的C例程来创建自定义的临时文件打开器功能,然后从Python调用它,然后可以使子进程访问文件而不会出现任何错误。但是我认为您应该坚持使用现有方法,因为它是最可移植的版本,可以在任何系统上使用,因此是最优雅的实现。

  • 关于Linux和Windows文件锁定的讨论可以在这里找到。

编辑:原来也可以从Windows中的多个进程打开和读取临时文件。请参阅PiotrDobrogost的答案

(…)

NamedTemporaryFile
在Windows上尝试重新打开失败的唯一原因是,当我们重新打开时,我们需要使用O_TEMPORARY。

他举例说明了如何在Python 3.3+中执行此操作

import os, tempfileDATA = b"hello bob"def temp_opener(name, flag, mode=0o777):    return os.open(name, flag | os.O_TEMPORARY, mode)with tempfile.NamedTemporaryFile() as f:    f.write(DATA)    f.flush()    with open(f.name, "rb", opener=temp_opener) as f:        assert f.read() == DATAassert not os.path.exists(f.name)

因为Python 2.xopener的内置函数中没有参数,所以open()我们必须结合使用较低的级别os.open()和os.fdopen()函数才能达到相同的效果:

import subprocessimport tempfileDATA = b"hello bob"with tempfile.NamedTemporaryFile() as f:    f.write(DATA)    f.flush()    subprocess_pre =     """import os       f = os.fdopen(os.open(r'{FILENAME}', os.O_RDWR | os.O_BINARY | os.O_TEMPORARY), 'rb')       assert f.read() == b'{DATA}'    """.replace('n', ';').format(FILENAME=f.name, DATA=DATA)    subprocess.check_output(['python', '-c', subprocess_pre]) == DATA


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506529.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号