gpt4 book ai didi

python - 将 NamedTemporaryFile 传递给 Windows 上的子进程

转载 作者:太空狗 更新时间:2023-10-30 01:32:01 26 4
gpt4 key购买 nike

python docs for tempfile.NamedTemporaryFile说:

Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later).

我有一个调用为 prog input.txt 的程序,但我无法触及。我想写一个 python 函数来给它一个字符串。

以下是一些不太奏效的方法:

from tempfile import NamedTemporaryFile
  1. 如果在 Windows 上合法则不明显

    with NamedTemporaryFile() as f:
    f.write(contents)
    subprocess.check_call(['prog', f.name]) # legal on windows?
  2. 可能过早删除文件

    with NamedTemporaryFile() as f:
    f.write(contents)
    f.close() # does this delete the file?
    subprocess.check_call(['prog', f.name])
  3. 没有正确清理

    with NamedTemporaryFile(delete=False) as f:
    f.write(contents) # if this fails, we never clean up!
    try:
    subprocess.check_call(['prog', f.name])
    finally:
    os.unlink(f.name)
  4. 有点丑

    f = NamedTemporaryFile(delete=False)
    try:
    with f:
    f.write(contents)
    subprocess.check_call(['prog', f.name])
    finally:
    os.unlink(f.name)

哪些是正确的?

最佳答案

如您所料,前三个变体都已损坏 - 第一个会在 Windows 上抛出 PermissionError;第二个确实过早删除了文件;第三个没有正确处理异常。

因此,您的第四个片段是正确的做法。


不过,正如你所说,它有点难看。我建议将它包装在一个函数中以提高可读性和可重用性:

import os
from contextlib import contextmanager
from tempfile import NamedTemporaryFile

@contextmanager
def ClosedNamedTempfile(contents, mode='w'):
f = NamedTemporaryFile(delete=False, mode=mode)
try:
with f:
f.write(contents)
yield f.name
finally:
os.unlink(f.name)

这允许我们像这样使用它:

with ClosedNamedTempfile('foobar\n') as f:
subprocess.check_call(['prog', f])

关于python - 将 NamedTemporaryFile 传递给 Windows 上的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46497842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com