【发布时间】:2016-04-11 13:45:45
【问题描述】:
我有以下代码:
import os
import sys
import tempfile
import subprocess
with tempfile.NamedTemporaryFile('w+') as f:
if sys.platform == 'linux':
subprocess.call('vim', f.name)
elif sys.platform == 'nt':
os.system(f.name)
在 Linux 上使用 vim 或在 Windows 上使用默认编辑器打开 foobar.txt。在 Linux 上它工作正常:tempfile.NamedTemporaryFile() 创建一个临时文件,vim 打开它。然而,在 Windows 上,系统会说:
该进程无法访问该文件,因为它正被另一个进程使用。
我猜这是因为脚本当前正在使用该文件。
为什么它可以在 Linux 上运行,我如何让它在 Windows 上运行?
【问题讨论】:
-
这是基本的 Windows I/O。所有文件都以特定的访问权限(读/写数据、删除、设置属性等)和访问共享模式打开。
NamedTemporary根据 delete-on-close 标志的要求以删除访问权限打开文件,并共享所有访问权限(读取、写入和删除)。随后再次打开文件需要共享删除访问权限,这是大多数程序不允许的。 -
仅供参考,您可以通过在关闭第一个句柄之前打开文件的第二个句柄来撤消关闭时删除标志的效果。当第一个句柄关闭时,它会在文件上设置删除处置,但直到所有句柄都关闭后才会删除。使用第二个句柄通过
SetFileInformationByHandle撤消删除处置。现在您可以关闭第二个句柄,并且文件不会被删除。 -
哈哈,@KevinGuan 认识eryksun很久了,他解决的问题多于答案,这也是我喜欢他这个人的原因之一。 :) (希望这次他会发布答案)
-
@KevinGuan:如果你关闭一个
tempfile.NamedTemporaryFile(或一个普通的tempfile.TemporaryFile``) it will be destroyed. See [the docs](https://docs.python.org/3/library/tempfile.html) for details. Perhaps you could use atempfile.mkstemp`文件? -
@KevinGuan:Unix 允许多个进程写入同一个文件,但您必须小心,正如this U&L question 中所讨论的那样。
标签: python linux windows file-io io