以下单元测试通过所有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/
前缀是如何工作的(一些googling让我相信它相当于%APPDATA%
的windows )。
有没有办法用跨平台的方式编写这段代码?
(如果有人感兴趣的话,特拉维斯跑站在https://travis-ci.org/datakortet/yamldirs/jobs/607842061 )。
发布于 2019-11-05 13:07:07
/tmp
是/private/tmp
on macOS的一个符号链接(/var
也是如此)。见跨站点Q&A Why is /tmp a symlink to /private/tmp?
因此,要跨平台编写它,只需解析链接:
assert os.path.realpath(curdir) == os.path.realpath(abspath_tmpdir)
发布于 2021-11-04 13:30:18
如果您使用的是pathlib.Path
,则等效的方法将是.resolve()
,例如:
assert Path(curdir).resolve() == Path(abspath_tmpdir).resolve()
发布于 2021-09-12 05:36:32
/tmp
位置是指向/private/tmp
的符号链接。
path = tempfile.TemporaryDirectory()
path.name: /var/folders/lf/872sgt9n4ld5s20mdj0_5txrds0wb5/T/tmpbxdp5c99
subprocess.check_output("pwd").decode().strip(): /private/var/folders/lf/872sgt9n4ld5s20mdj0_5txrds0wb5/T/tmpbxdp5c99
os.getcwd(): /private/var/folders/lf/872sgt9n4ld5s20mdj0_5txrds0wb5/T/tmpbxdp5c99
os.path.realpath(path.name): /private/var/folders/lf/872sgt9n4ld5s20mdj0_5txrds0wb5/T/tmpbxdp5c99
https://stackoverflow.com/questions/58719364
复制相似问题