当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中访问当前执行的模块或类名?

如何解决《如何在Python中访问当前执行的模块或类名?》经验,为你挑选了5个好方法。

我希望能够从导入的模块中动态检索当前执行的模块或类名.这是一些代码:

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"),以便每个应用程序的日志文件将进入各自的日志记录目录.

为了做到这一点,我认为最好的办法是对记录器模块能够获得某种形式的全局变量,它表示当前应用程序的名称,因为它是负责了解父日志目录的位置,并创建应用程序的日志目录,如果它还不存在.



1> S.Lott..:

从评论 - 不是问题.

我很想知道我想做的事情是否可行.

"有可能"的答案总是"是".总是.除非您的问题涉及时间旅行,反重力或永久运动.

由于答案总是"是",你的问题是不正确的.真正的问题是"让我的日志记录模块知道客户端名称的好方法是什么?" 或类似的东西.

答案是"接受它作为参数".不要乱用于检查或寻找神秘的全局或其他技巧.

只需遵循logging.getLogger()的设计模式,并使用显式命名的记录器.一个常见的习语如下

logger= logging.getLogger( __name__ )

它几乎可以完美地处理所有日志命名.


虽然如果我运行脚本而不是导入它,`__name__`将包含`__main__`而不是脚本的真实路径(如`modA.submodB.pack1`).有没有*总是*返回模块路径的值,无论它如何被调用?
"'有可能'的答案总是'是'." 或者在多项式时间内解决NP问题.然后它"可能,但大多数人认为不是".;)
实际上python中有一个反重力模块(虽然不确定时间旅行和永动)
我认为您是对的,因为我会更好地调整自己的方法-谢谢!

2> newtover..:

这应该适用于引用当前模块:

import sys
sys.modules[__name__]



3> Brian..:

"当前正在执行的模块"显然是foo,因为它包含当前正在运行的功能 - 我认为更好的描述你想要的是foo的直接调用者的模块(如果你调用af(这可能本身就是foo)从一个函数调用foo函数调用吧.你想要达到多远取决于你想要的东西.

在任何情况下,假设您想要直接调用者,您可以通过向上调用堆栈来获得此调用.这可以通过调用sys._getframe适当数量的级别来完成.

def f():
    caller = sys._getframe(1)  # Obtain calling frame
    print "Called from module", caller.f_globals['__name__']

[编辑]:实际上,如上所述使用检查模块可能是获得堆栈帧的更简洁方法.等效代码是:

def f():
    caller = inspect.currentframe().f_back
    print "Called from module", caller.f_globals['__name__']

(sys._getframe记录为供内部使用 - inspect模块是更可靠的API)



4> utku_karatas..:

__file__ 是进行调用的当前模块的路径.



5> nstehr..:

我想你想要使用的是inspect模块,来检查python运行时堆栈.看看这个教程.我认为它提供了你想要做的几乎完全的例子.


链接坏了.
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有