问题描述
我正在编写一个Python库,您可以从文件中加载对象并对其进行处理。为了方便起见,我想这样做,以便人们可以提供三种路径:
-
以“ /”开头的路径,它将被解释为绝对路径
-
以这两个开头的路径,这将被解释为相对于导入我的库的顶级脚本目录的相对路径。
我的问题是:处理第三种情况的最佳方法是什么?我在Stack Overflow上遇到的两种方法都是klugey:
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__)
很明显,如果我们从交互式终端或其他设备上运行,这两种方法都会失败,并且在这种情况下,我想退回到仅将其视为绝对路径的方式。
无论如何,我感觉到在库中使用像这样的检查是不受欢迎的,但是另一种方式似乎也很笨拙。有一个我不知道的更好的方法吗?
解决方法
使用内置软件包pathlib
的{{1}}方法。它默认为顶层软件包的根文件夹。
如果更改工作目录,将无法工作。虽然,不带前缀的路径通常是相对于工作目录的。
getcwd