当前位置: 首页 > 面试题库 >

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

苏嘉歆
2023-03-14
问题内容

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

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

为此,我认为最好的方法是使logger模块可以访问某种表示当前应用程序名称的全局变量,因为它负责了解父日志目录的位置并创建应用程序的日志记录目录(如果尚不存在)。


问题答案:

从评论-不是问题。

我只是好奇地想知道我要做什么。

“是否可能”的答案始终是“是”。总是。除非您的问题涉及时间旅行,反重力或永恒运动。

由于答案始终是“是”,因此您的问题形式不正确。真正的问题是“让我的日志记录模块知道客户端名称的好方法是什么?” 或类似的东西。

答案是“接受它作为参数”。不要乱搞检查或寻找神秘的全局变量或其他技巧。

只需遵循logging.getLogger()的设计模式并使用显式命名的记录器即可。常见的成语如下

logger= logging.getLogger( __name__ )

这几乎可以完美处理所有日志命名。



 类似资料:
  • 问题内容: 我已经看到了很多人从一个模块中提取所有类的示例,通常是这样的: 太棒了 但是我无法找到如何从 当前 模块中获取所有类。 这可能确实很明显,但是我什么也找不到。谁能帮我吗? 问题答案: 尝试这个: 在您的情况下: 甚至更好: 因为带谓语。

  • 问题内容: 我有调用其他脚本文件的脚本,但是我需要获取该进程中当前正在运行的文件的文件路径。 例如,假设我有三个文件。使用: 来电。 调用。 我怎样才能获得的文件名和路径,从内部代码,而无需从传递这些信息作为参数? (执行将返回原始启动脚本的文件路径,而不是当前文件的路径。) 问题答案: p1.py: p2.py:

  • 最后,我想要做的是在转换json的每一行时将文件名传递到转换函数中(请参见此内容,然后使用文件名在不同的BQ表中进行查找以获得值)。我想一旦我设法知道如何获得文件名,我将能够找出侧输入部分,以便在bq表中进行查找,并获得唯一的值。

  • 问题内容: 似乎是一个新手问题,但事实并非如此。一些通用方法并非在所有情况下都有效: sys.argv [0] 这意味着使用,但是如果你是从另一个目录中的另一个Python脚本运行的,则此方法不起作用,并且这可能在现实生活中发生。 文件 这意味着使用,但是我发现这不起作用: py2exe没有属性,但是有一种解决方法 当你从IDLE运行时,没有属性 我得到的 答案不完整的相关问题: Python-查

  • 我正在编写一个处理多个系统的应用程序。用户可以选择他想使用的系统,我将该系统ID存储在会话(客户端会话)中 现在我有了服务类,比如说CustomerService。 我想使用 Guice 将客户实例注入控制器。但是我想使用存储在会话中的系统ID实例化客户服务。 如何访问<code>请求。Guice模块中的会话? 编辑: 简化了我上面的代码。我的实际代码使用接口。我如何使用辅助注射? 这给了我:客户

  • 问题内容: 我想导入foo-bar.py。这有效: 这不是: 我的问题:有什么方法可以使用上述格式,即导入其中包含的模块? 问题答案: 你不能。 不是标识符。将文件重命名为 编辑: 如果不是您的目标(例如:您不在乎会发生什么,您不需要导入自身),只需将文件的所有全局变量都放入自己的作用域中,就可以使用