创建一个唯一的文件系统路径,没有任何真实文件

时间:2016-02-14 21:40:07

标签: python temporary-files deprecation-warning

程序应如何生成唯一的文件系统路径,创建 文件系统条目?

tempfile.mktemp函数是strongly deprecated,这是正确的,因为它使程序容易受到不安全文件创建的影响。

在某些代码(例如单元测试)中,我正在调用tempfile.mktemp 为我不想要的文件系统条目生成唯一路径 存在于真实的文件系统中。在这种情况下文件系统安全性 担忧是无关紧要的,因为没有文件。

该功能的弃用仍然是一个问题,因为我没有 想要使每个尽责的读者都需要决定是否需要的代码 代码是个问题。相反,代码应该避免正确弃用 的API。

该API函数也很容易在某个时刻消失 未来,因为它被明确地强烈弃用。

tempfile提供的其他功能根本不需要避免触及文件系统,只是为了获得一条独特的路径。

所以我同意tempfile.mktemp一般的弃用,但图书馆似乎没有为此目的提供替代。

我应该使用什么标准库函数来生成 tempfile.mktemp - 与唯一路径一样,创建真实文件 通过那条路?

3 个答案:

答案 0 :(得分:2)

AFAIK没有这样的标准功能,它会生成一个唯一的名称,但不会创建文件。 看看" mktemp"的内部实现。功能并创建自己的...

以下是您可能感兴趣的代码:

class _RandomNameSequence:
    """An instance of _RandomNameSequence generates an endless
    sequence of unpredictable strings which can safely be incorporated
    into file names.  Each string is six characters long.  Multiple
    threads can safely use the same instance at the same time.

    _RandomNameSequence is an iterator."""

    characters = "abcdefghijklmnopqrstuvwxyz0123456789_"

    @property
    def rng(self):
        cur_pid = _os.getpid()
        if cur_pid != getattr(self, '_rng_pid', None):
            self._rng = _Random()
            self._rng_pid = cur_pid
        return self._rng

    def __iter__(self):
        return self

    def __next__(self):
        c = self.characters
        choose = self.rng.choice
        letters = [choose(c) for dummy in range(8)]
        return ''.join(letters)

答案 1 :(得分:1)

这是一个代码维护问题,与编程问题一样多。这是解决它的一个选项:

  • 围绕tempfile.mktemp创建一个包装函数,其中包含与您的域匹配的描述性名称(例如,create_database_path_name的内容)
  • 在实施中,在tempfile.mktemp调用之上写一条评论,解释为什么它被仔细权衡,并认为这种用法是安全的,尽管有弃用。

第一步确保不推荐使用的函数只包含在一个地方。第二步确保将一个地方记录在案以供将来的代码审查。

如果已弃用的功能从模块中消失,则只有一个地方需要修复,例如通过复制原始实现。

答案 2 :(得分:0)

// webpack.config.js resolve: { root: '/absolute/path/to/root' // usually just __dirname }, 弃用的原因与您无关,因为您不打算制作该文件。它会生成随机文件名,这就是你想要的。如果您担心那些不了解的评论者,可以做一个简单的评论。或者,您可以创建自己的文件名,例如mktemp,而不是冒犯他们敏感的感觉。