为什么 pathlib.Path(__file__).parent.parent 对我的工作目录敏感?

Mat*_*ice 7 python pathlib

我有一个位于两个目录下的脚本。

\n
\xe2\x9d\xaf tree\n.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bar\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.py\n\xe2\x9d\xaf cd foo/bar\n\xe2\x9d\xaf cat test.py\n\n    from pathlib import Path\n    print(Path(__file__).parent)\n    print(Path(__file__).parent.parent)\n
Run Code Online (Sandbox Code Playgroud)\n

当我从包含该文件的目录运行它时,PathLib 认为该文件的祖父与其父级相同。

\n
\xe2\x9d\xaf python test.py\n\n    . # <-- same\n    . # <-- directories\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我从顶层运行它时,PathLib 行为正确。

\n
\xe2\x9d\xaf cd ../..\n\xe2\x9d\xaf python foo/bar/test.py\n\n    foo/bar # <-- different\n    foo     # <-- directories\n
Run Code Online (Sandbox Code Playgroud)\n

我是否误解了 PathLib 的 API,或者是否有其他原因导致其输出对我的工作目录敏感?

\n

Iai*_*ton 10

您需要调用Path.resolve()以使路径成为绝对路径(包括所有父目录并删除所有符号链接的完整路径)

from pathlib import Path
print(Path(__file__).resolve().parent)
print(Path(__file__).resolve().parent.parent)
Run Code Online (Sandbox Code Playgroud)

这将导致结果包含每个目录的完整路径,但无论从哪里调用该行为都将起作用