从外部文件访问脚本文件位置 python

Accessing script file location from an external file python

我有以下奇怪的设置。考虑不同目录中的 3 个脚本:

第一个文件及其位置是完全可以修改的。第二个和第三个完全固定。

scriptA.py 包含一个 parent class:

class A:
    def get_path(self):
        # ...
        # code to determine "my_path"
        # ...
        return my_path

scriptB.py 包含一个 child class:

from root1.folderA.scriptA import A

class B(A):
    pass

scriptC.py 包含要执行的代码:

from root2.folderB.scriptB import B

if __name__ == "__main__":
    b = B()
    print(b.get_path()) # want print root/folderB/scriptB.py

在 scriptC.py 中,我想要的是获取 child class 的声明文件(没有任何 hard-coding)的路径的行为。有什么方法可以对 A.get_path() 进行编程以实现这种行为吗?

我已经尝试查看 inspectos.pathpathlib 模块,但我没有任何运气。

看起来诀窍是使用 __init_subclass__,它会在 class 为 sub-classed 时与 class 的 __module__ 一起运行属性检索其包含模块,__file__ 检索 python 脚本或模块的绝对路径。

例如,在script_a.py中:

import sys
from pathlib import Path


class PathInfo:
    __slots__ = ()

    path: Path

    def __init_subclass__(cls, **kwargs):
        mod = sys.modules[cls.__module__]
        # `__file__` is a string, so we want to convert to a `Path` so it's easier to work with
        cls.path = Path(mod.__file__)


class A(PathInfo):
    __slots__ = ()

script_b.py:

from script_a import A


class B(A):
    pass


# prints: /Users/<name>/PycharmProjects/my-project/script_a.py
print(A().path)
# prints: /Users/<name>/PycharmProjects/my-project/script_b.py
print(B.path)