You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:51:20