Skip to main content
 首页 » 编程设计

python之tempfile.mkdtemp() 在 osx 上的区别

2024年08月12日29duanxz

以下单元测试通过了所有 linux/python 和 windows/python 组合:

import os 
import tempfile 
from contextlib import contextmanager 
 
def test_cd_to_tempdir(): 
    initial_cwd = os.getcwd() 
    abspath_tmpdir = tempfile.mkdtemp() 
    try: 
        assert os.path.isabs(abspath_tmpdir) 
        os.chdir(abspath_tmpdir) 
        curdir = os.getcwd() 
        assert initial_cwd != curdir 
        assert curdir == abspath_tmpdir 
    finally: 
        os.chdir(initial_cwd)      # must exit directory.. 
        os.rmdir(abspath_tmpdir)   # ..before it can be removed 

并在 osx 上失败(仅测试 3.7.4)并出现以下错误:

        try: 
            assert os.path.isabs(abspath_tmpdir) 
            os.chdir(abspath_tmpdir) 
            curdir = os.getcwd() 
            assert initial_cwd != curdir 
>           assert curdir == abspath_tmpdir 
E           AssertionError: assert '/private/var...T/tmpoz7eo_yj' == '/var/folders/...T/tmpoz7eo_yj' 
E             - /private/var/folders/17/5mc7816d3mndxjqgplq6057w0000gn/T/tmpoz7eo_yj 
E             ? -------- 
E             + /var/folders/17/5mc7816d3mndxjqgplq6057w0000gn/T/tmpoz7eo_yj 

我不是 mac 用户,所以我真的不知道 /private/ 前缀是如何工作的(一些谷歌搜索让我相信它是 mac 等同于 windows % APPDATA%).

有没有办法以跨平台的方式编写这段代码?

(travis 运行地址为 https://travis-ci.org/datakortet/yamldirs/jobs/607842061,如果有人感兴趣的话)。

请您参考如下方法:

/tmp 是 macOS 上 /private/tmp 的符号链接(symbolic link)(/var 也是如此)。见跨站问答Why is /tmp a symlink to /private/tmp?

所以要跨平台编写它,您只需解析链接即可:

assert os.path.realpath(curdir) == os.path.realpath(abspath_tmpdir)