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

标签 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/ 前缀是如何工作的(一些谷歌搜索让我相信它是 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)

关于python - tempfile.mkdtemp() 在 osx 上的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58719364/

相关文章:

python - 将 NumPy 数组映射到位

python - 如何在 Mac M1 上安装多个 Python 版本

python - 从 MultiIndex 中选择特定级别

macos - Cocoa 中的 OS X 版本检查

ios - 如果在 IB 中使用自动布局设置 View ,如果您尝试以编程方式更改其框架,会发生什么情况?

python - pip install --user -e/home/me/package/权限被拒绝

python - 如何通过python的re模块从字符串末尾删除最短的匹配模式?

apache - Mac 上 Apache 服务器的用户组名称是什么?

java - Mac OS X 上的 Java 重量级组件

c++ - 如何更新到 C++11?