tempfile.mkdtemp()在OSX上的区别?

时间:2019-11-05 20:57:26

标签: python macos

以下单元测试通过了所有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/前缀的工作原理(有些搜索使我相信它等同于Windows %APPDATA%的Mac)。

是否可以跨平台编写此代码?

(如果有人感兴趣,travis运行在https://travis-ci.org/datakortet/yamldirs/jobs/607842061上。)

1 个答案:

答案 0 :(得分:3)

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

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

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