从 Python 中的库中获取主脚本路径的正确方法

Proper way of getting path of main script from library in Python

我正在编写一个 Python 库,您可以在其中从文件加载对象并对其进行处理。为了方便起见,我想使人们可以提供三种路径:

  1. 以“/”开头的路径,将被解释为绝对路径

  2. 以“~/”开头的路径,将被解释为相对于用户的主目录(我打算为此使用 os.path.expanduser

  3. 不以两者开头的路径,将被解释为相对于导​​入我的库的顶级脚本的目录。

我的问题是:处理第三种情况的最佳方法是什么?我在 Stack Overflow 上遇到的两种方式都有些笨拙:

1)

import __main__
if hasattr(__main__, "__file__"):
    script_dir = os.path.dirname(os.path.abspath(__main__.__file__))
import inspect
frame_info = inspect.stack()[-1]
mod = inspect.getmodule(frame_info[0])
script_dir = os.path.dirname(mod.__file__)

显然,如果我们 运行 来自交互式终端或其他东西,这两种方法都会失败,在这种情况下,我想退回到只将其视为绝对路径。

无论如何,我觉得在库中使用这样的检查是不受欢迎的,但其他方式似乎也很麻烦。有没有我不知道的更好的方法?

使用 built-in 包 pathlibgetcwd 方法。默认为顶层包根目录

如果您更改工作目录,将无法工作。虽然,不带前缀的路径是相对于工作目录的常见做法。

import pathlib
print(pathlib.Path.cwd())

>>> A:\Programming\Python\generalfile