从 Python 中的库中获取主脚本路径的正确方法
Proper way of getting path of main script from library in Python
我正在编写一个 Python 库,您可以在其中从文件加载对象并对其进行处理。为了方便起见,我想使人们可以提供三种路径:
以“/”开头的路径,将被解释为绝对路径
以“~/”开头的路径,将被解释为相对于用户的主目录(我打算为此使用 os.path.expanduser
)
不以两者开头的路径,将被解释为相对于导入我的库的顶级脚本的目录。
我的问题是:处理第三种情况的最佳方法是什么?我在 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 包 pathlib
的 getcwd
方法。默认为顶层包根目录
如果您更改工作目录,将无法工作。虽然,不带前缀的路径是相对于工作目录的常见做法。
import pathlib
print(pathlib.Path.cwd())
>>> A:\Programming\Python\generalfile
我正在编写一个 Python 库,您可以在其中从文件加载对象并对其进行处理。为了方便起见,我想使人们可以提供三种路径:
以“/”开头的路径,将被解释为绝对路径
以“~/”开头的路径,将被解释为相对于用户的主目录(我打算为此使用
os.path.expanduser
)不以两者开头的路径,将被解释为相对于导入我的库的顶级脚本的目录。
我的问题是:处理第三种情况的最佳方法是什么?我在 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 包 pathlib
的 getcwd
方法。默认为顶层包根目录
如果您更改工作目录,将无法工作。虽然,不带前缀的路径是相对于工作目录的常见做法。
import pathlib
print(pathlib.Path.cwd())
>>> A:\Programming\Python\generalfile