如何将上下文扩展到整个脚本?

时间:2014-07-21 01:14:39

标签: python scope temporary-files

我在Python中创建一个类,其中一个方法需要处理文件并将它们保存在临时目录中。方法完成后,临时目录将被删除。我需要临时目录可用于整个脚本,而不仅仅是方法。

import tempfile
import os

class sandbox:
    def start_tmp_dir():
        temp_dir = tempfile.TemporaryDirectory()
        print('tmp dir available in start_tmp_dir: ' + str(os.path.isdir(temp_dir.name)))
        return temp_dir.name

    def use_tmp_dir(dir_name):
        print('tmp dir available in use_tmp_dir: ' + str(os.path.isdir(dir_name)))

if __name__ == "__main__":
    sandbox = sandbox
    dir_name = sandbox.start_tmp_dir()
    sandbox.use_tmp_dir(dir_name)

输出:

tmp dir available in start_tmp_dir: True
tmp dir available in use_tmp_dir: False

Python手册says this

  

完成上下文或销毁临时目录   对象新创建的临时目录及其所有内容   从文件系统中删除。

鉴于我创建的示例,这是有道理的。文档还讨论了使用with和上下文管理器,但我似乎无法使其中任何一个工作。

2 个答案:

答案 0 :(得分:1)

创建该类的实例并使用self.temp_dir,只要对象/实例存在,它就会存在。

import tempfile
import os

class Sandbox(): # uppercase - see "PEP 8 -- Style Guide for Python Code"

    def start_tmp_dir(self): # self
        self.temp_dir = tempfile.TemporaryDirectory() # self.temp_dir
        print('tmp dir available in start_tmp_dir: ' + str(os.path.isdir(self.temp_dir.name))) # self.temp_dir
        return self.temp_dir.name # self.temp_dir

    def use_tmp_dir(self, dir_name):
        print('tmp dir available in use_tmp_dir: ' + str(os.path.isdir(dir_name)))

if __name__ == "__main__":
    sandbox = Sandbox() # uppercase and ()
    dir_name = sandbox.start_tmp_dir()
    sandbox.use_tmp_dir(dir_name)

答案 1 :(得分:0)

要实现这一点,您需要将其用作上下文管理器。像这样:

#!/usr/bin/python

import tempfile
import os

class Sandbox(object):
    def __init__(self, temp_dir):
        self.temp_dir = temp_dir
        print('tmp dir available in constructor: ' + str(os.path.isdir(self.temp_dir)))

    def use_tmp_dir(self):
        print('tmp dir available in use_tmp_dir: ' + str(os.path.isdir(self.temp_dir)))

if __name__ == "__main__":
    with tempfile.TemporaryDirectory() as temp_dir:
        s = Sandbox(temp_dir)
        s.use_tmp_dir()