2009-07-11 60 views
1

好的,所以我知道from-importimport“完全相同”,但显然不是因为名称空间的填充不同。“从进口”执行整个模块吗?

我的问题是主要动机,因为我有一个utils模块,具有了在我的应用程序使用的所有其他模块的一个或两个功能,并且据我工作纳入标准库logging模块,我可以告诉我需要做的几分像这样:

import logging 
logging.basicConfig(filename="/var/log") # I want file logging 

baselogger = logging.getLogger("mine") 
#do some customizations to baselogger 

,然后在不同的模块使用它,我会再次导入日志:

import logging 
logger = logging.getlogger("mine") 

# log stuff 

但我想知道的是,如果我做了from utils import awesome_func将会确定我的记录器,并且将按照我的需要设置记录模块?

这也适用于其他通用设置。

回答

5

看起来像答案是肯定的:

$ echo 'print "test" 
def f1(): 
    print "f1" 

def f2(): 
    print "f2" 

' > util.py 

$ echo 'from util import f1 
f1() 
from util import f2 
f2() 
' > test.py 

$ python test.py 
test 
f1 
f2 

$ 
+0

谢谢。用一个非常小的测试日志记录模块进行更具体的操作,表明它可以正确初始化。 – quodlibetor 2009-07-12 19:24:10

1

是的,from MODULE import OBJECT执行模块中的所有内容,然后有效地执行OBJECT = MODULE.OBJECT。从某种意义上说,您可以知道该模块已被加载,因为它现在位于sys.modules字典中。

6

的回答你的问题是肯定的。

有关导入过程的很好解释,请参阅Frederik Lundh的“Importing Python Modules”。

特别是,我会引用回答您的查询的部分。

Python会如何导入模块?

[...]

  1. 创建一个新的,空的模块对象(这基本上是一个字典)
  2. 插入在字典sys.modules
  3. 加载模块代码模块对象对象(如有必要,先编译模块)
  4. 在新模块的名称空间中执行模块代码对象。代码分配的所有变量将通过模块对象提供。

和使用from-import

有很多方法导入模块

[...]

从X导入, b,c导入模块X,并在当前命名空间中为给定对象创建引用。换句话说,你现在可以在你的程序中使用a和b和c。

注意我已经忽略了一些问题。这是值得阅读整个文件,它实际上很短。

+0

谢谢,在我问我的问题之前,我确实已经阅读过这篇文章,但是我不觉得“从X导入a,b,c”部分是完全清楚的。因为它不像上面的部分那样导入模块。但是,基于所提供的所有其他证据,这当然足够接近。 – quodlibetor 2009-07-12 19:23:06

0

如上所述,是的。 ,你可以写简单的测试,以确保:怎么有的进口或子类或thomething别的办法

# file m.py 
import sys 

# define function 
def f(): 
    pass 

#execute this when module is loaded (i.e. imported or run as script) 
print 'imported', __name__ 
# print all "exposed" variables to make sure that the f is visible 
print dir(sys.modules[__name__]) 

# file main.py 
from m import f 
print 'done' 

我建议在每怀疑你的时间来写这样的测试。