至少如果您使用现有的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


