Python中如何让类实例获取其实例化所在文件的路径?
问题:让Foo实例获取
__main__.py的路径 项目文件夹结构
foo/ ├─ foo/ │ ├─ foo.py │ ├─ __init__.py __main__.py
foo/foo.py
import os class Foo: def __init__(self): self.origin = os.path.realpath(__file__)
foo/init.py
from .foo import Foo
main.py
from .foo import Foo import os if __name__ == "__main__": my_foo = Foo() print("\twant:", os.path.realpath(__file__)) print("\thave:", my_foo.origin)
运行情况
从根目录外执行命令:python -m foo,输出如下:
want: ...\foo\__main__.py have: ...\foo\foo\foo.py
我原本以为在__main__.py中实例化Foo()时,__file__会指向__main__.py的路径,但实际并非如此。请问要怎么做才能让第二行(have)和第一行(want)的路径一致?
我遇到的问题和另一篇提问类似,但该问题的解决方案对我无效。
解决方案
问题核心:__file__指向的是当前代码所在文件的路径,和实例化代码的位置无关。Foo类定义在foo.py里,所以该文件中的__file__永远指向foo.py的路径。
要实现需求,有两种直接可行的方法:
方法1:实例化时主动传递路径
修改Foo的构造函数,让它接收外部传入的路径参数,在__main__.py中把自身的__file__传进去:
# foo/foo.py import os class Foo: def __init__(self, origin=None): # 优先使用传入的路径,默认值保留原有逻辑 self.origin = os.path.realpath(origin) if origin else os.path.realpath(__file__)
# __main__.py from .foo import Foo import os if __name__ == "__main__": my_foo = Foo(origin=__file__) print("\twant:", os.path.realpath(__file__)) print("\thave:", my_foo.origin)
方法2:直接获取主模块的文件路径
Python的__main__模块对应启动脚本,通过sys.modules可以直接获取它的__file__属性:
# foo/foo.py import os import sys class Foo: def __init__(self): # 直接读取主模块的文件路径 self.origin = os.path.realpath(sys.modules['__main__'].__file__)
这样无论Foo在哪里实例化,只要是通过python -m foo启动,self.origin都会指向__main__.py的路径。
内容的提问来源于stack exchange,提问作者d.b
相关产品推荐
相关产品推荐

