【发布时间】:2010-10-10 19:28:42
【问题描述】:
我希望能够从导入的模块中动态检索当前正在执行的模块或类名。这是一些代码:
foo.py:
def f():
print __name__
bar.py:
from foo import f
def b(): f()
这显然不起作用,因为__name__ 是包含该函数的模块的名称。我想在foo 模块中访问的是正在使用foo 的当前执行模块的名称。因此,在上述情况下,它将是 bar,但如果有任何其他模块导入 foo,我希望 foo 能够动态访问该模块的名称。
编辑:inspect 模块看起来很有前途,但它并不是我想要的。我希望的是某种可以访问的全局或环境级变量,其中包含当前执行模块的名称。并不是说我不愿意遍历堆栈来查找该信息——我只是认为 Python 可能已经暴露了该数据。
编辑:这是我尝试使用它的方式。我有两个不同的 Django 应用程序,它们都需要将错误记录到文件中。可以说它们被称为“AppOne”和“AppTwo”。我也有一个我想记录这些文件的地方:“/home/hare/app_logs”。在任何给定点的每个应用程序中,我都希望能够导入我的记录器模块并调用将日志字符串写入文件的日志函数。但是我想做的是在app_logs 下创建一个目录,该目录是当前应用程序的名称(“AppOne”或“AppTwo”),以便每个应用程序的日志文件将进入各自的日志目录。
为了做到这一点,我认为最好的方法是让记录器模块访问某种表示当前应用程序名称的全局变量,因为它负责了解父记录目录的位置并创建应用程序的日志目录(如果尚不存在)。
【问题讨论】:
-
为什么要这样打破责任分配?
-
我在日志模块中使用它 - 我希望能够判断哪个外部模块正在尝试记录,而调用者不必传递某种密钥。
-
您是否正在寻找启动程序执行的模块(即:name == 'main' 的模块?调用 foo.f() 的模块,每次调用 foo.f() 时可能不同?
-
@Andrew Hare:您是说 (a) 您编写了自己的记录器,与内置的日志记录模块不同,并且 (b) 您自己的记录器没有简单的配置类或函数?你想解决这个问题吗?
-
@S.Lott - a) 是,b) 是,而且根本没有解决方法 - 只是稍微了解一下。