在子进程调用后删除 Python 中的 NamedTemporaryFile

问题描述

我不想在子流程执行完成之前删除临时文件,因此,我调用子流程脚本为:

import os
import tempfile
import subprocess


def main():
    with tempfile.NamedTemporaryFile("w",delete=False) as temp:
        temp.write("Hello World")
        temp.flush()

        print(f"Temp file is: {temp.name}")
        args = ["python3",os.path.dirname(__file__) + "/hello_world.py","--temp-file",temp.name]
        subprocess.Popen(args)
    return


main()

hello_world.py

import argparse
import sys


def print_hello():
    print("Hello World")
    return


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="""Test case""")

    parser.add_argument('--temp-file',required=True,help='For test')

    args = parser.parse_args()
    print(args)
    print_hello()
    sys.exit(0)

我希望在子进程执行完成后删除临时文件

在这种情况下,我需要手动删除临时文件吗?

解决方法

调用 subprocess.Popen() 会启动进程,但不会等待它完成。

如果您想在退出 with 块之前等待进程完成,您可以改用 subprocess.run()

编辑:根据您的评论,您不想等待该过程完成。由于您使用delete=False创建文件,因此在with块末尾关闭文件指针时不会删除该文件,因此您需要手动删除路径,无论是在父进程或子进程。