以下单元测试通过了所有 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/