在python中查找导入内容的位置

时间:2013-09-20 18:48:31

标签: python

在django项目中,有时你会有像

这样的代码
from settings import *

from local_settings import *

然后在其余代码中执行

之类的操作
from django.conf import settings

我想要做的是找出如何知道哪个部分的设置来自哪个文件。我猜我必须以某种方式挂钩导入模块,并且可能在导入之前和之后跟踪“设置”。

甚至不确定从哪里开始这样的事情。我知道__file__,但由于我正在寻找设置模块中每个变量的来源,因此无法使用。


更多信息

我写了一个django应用程序,我想开源,它会显示你的复合设置。但在我发布它之前,我想添加查看各个设置来自哪里的功能。与Chrome devtools中的“匹配CSS规则”类似。

我的一些项目导入多达4个文件,一个base.py,一个customer.py一个sub -customer.py,然后是machine.py。弄清楚设置的来源有时会很有趣。

4 个答案:

答案 0 :(得分:3)

普通价值没有进口来源。

解决方案不是使用from <module> import *指令;而是导入模块并直接引用其成员。

另一个实用的解决方案是使用一个ide,它可以显示每个文件中定义的内容,并使用它来帮助您分析给定设置的来源。

程序化解决方案(假设每个设置文件不导入另一个)是导入一个文件,复制其__dict__,然后导入下一个文件。然后,您可以将它们进行比较以进行更改,然后重复下一次导入。

答案 1 :(得分:3)

类,函数和其他几个对象具有__module__属性。您可以从sys.modules获取模块对象:

>>> import os
>>> os.utime.__module__
'posix'
>>> import sys
>>> sys.modules[os.utime.__module__]
<module 'posix' (built-in)>

PS:我建议您遵循Marcin的建议,避免明星进口。

答案 2 :(得分:1)

即使您使用*导入:

from base import *
from customer import *
from subcustomer import *
from machine import *

您仍然可以导入模块本身:

import base
import customer
import subcustomer
import machine

并了解每个模块已将哪些变量添加到全局命名空间:

base_names = set(dir(base))
customer_names = set(dir(customer))
subcustomer_names = set(dir(subcustomer))
machine_names = set(dir(machine))
common = base_names & customer_names & subcustomer_names & machine_names

我不确定您希望如何处理已在多个模块中定义的变量名称。但是你可以通过使用set subtraction找到由特定模块明确定义的名称。例如,要查找由base模块明确定义的名称,您可以计算:

base_names - customer_names - subcustomer_names - machine_names

答案 3 :(得分:0)

尝试查看检查模块。 http://docs.python.org/2/library/inspect.html? 你可以查看整个电话堆栈。

但实际上,你想要解决什么?