如何在Python中获取类的文件路径?


95

给定Python中的类C,如何确定该类在哪个文件中定义?我需要可以从类C或从关闭C的实例工作的东西。

之所以这样做,是因为我通常不喜欢将属于同一文件的文件放在同一文件夹中。我想创建一个使用Django模板将其自身呈现为HTML的类。基本实现应根据定义类的文件名来推断模板的文件名。

假设我在文件“ base / artifacts.py”中放置了一个LocationArtifact类,那么我希望默认行为是模板名称为“ base / LocationArtifact.html”。



2
那些假设您知道您要查找文件的模块,在处理类之外的实现时,我只有模块字符串。
Staale,2009年

Answers:


130

您可以使用检查模块,如下所示:

import inspect
inspect.getfile(C.__class__)

1
不知道我在做什么不同,但是getfile我不得不使用: inspect.getmodule(C.__class__)
AJP

4
注意:不适用于用户创建的类
Daniel Braun

6
这应该是inspect.getfile(C)。如果C是类,则C.__class__引用object,这将引发异常TypeError: <module 'builtins' (built-in)> is a built-in class。我认为c您只想使用实例inspect.getfile(c.__class__)
cheshirekow

1
对于扩展抽象基类(metaclass=abc.ABCMeta)的类,这/usr/local/lib/python3.7/abc.py不是必需的,因为它将返回而不是相应的文件。@JarretHardie(下)的解决方案效果更好。
martian111

36

尝试:

import sys, os
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)

1
要从C的实例(OP希望)获取路径,请替换LocationArtifactobj.__class__obj是LocationArtifact的实例。
martian111

5

对于Django而言,这是错误的方法,并且实际上是强迫的。

典型的Django应用程序模式为:

  • /项目
    • / appname
      • models.py
      • views.py
      • /模板
        • index.html
        • 等等

1
+1:做Django自然做的事情,生活就简单得多。
S.Lott,2009年

1
同意 Django是“魔术”最少的框架之一,但是模板,模板标签和应用程序对其模式有一些期望。如果您必须进行古怪的类推断,那么您可能走错了方向。
苏联2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.