以下单元测试通过了所有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上。)
答案 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)