从外部文件访问脚本文件位置 python
Accessing script file location from an external file python
我有以下奇怪的设置。考虑不同目录中的 3 个脚本:
- root1/folderA/scriptA.py
- root2/folderB/scriptB.py
- root2/folderC/scriptC.py
第一个文件及其位置是完全可以修改的。第二个和第三个完全固定。
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()
进行编程以实现这种行为吗?
我已经尝试查看 inspect
、os.path
和 pathlib
模块,但我没有任何运气。
看起来诀窍是使用 __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)
我有以下奇怪的设置。考虑不同目录中的 3 个脚本:
- root1/folderA/scriptA.py
- root2/folderB/scriptB.py
- root2/folderC/scriptC.py
第一个文件及其位置是完全可以修改的。第二个和第三个完全固定。
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()
进行编程以实现这种行为吗?
我已经尝试查看 inspect
、os.path
和 pathlib
模块,但我没有任何运气。
看起来诀窍是使用 __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)