请问“从进口”执行的是整个模块?(Does “from-import” exec the whole

2019-07-30 02:07发布

好了,我知道, from-import是“精确”一样的import ,但它显然不是因为命名空间中填充不同。

我的问题是主要动机,因为我有一个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将我的记录器肯定会成立,并会记录模块设置我想要的方式?

这将适用于其它一般的调校也是如此。

Answer 1:

看起来像答案是肯定的:

$ 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

$ 


Answer 2:

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

对于导入过程的一个很好的说明,请参阅弗雷德里克Lundh的“ 导入的Python模块 ”。

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

这是什么做的Python导入模块?

[...]

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

并利用from-import

有很多方法导入模块

[...]

从X进口A,B,C导入模块X,并且会在当前命名空间中给定对象的引用。 或者换句话说,你现在可以使用a和b和c在你的程序。

请注意,我省略掉了一些问题。 这是值得阅读整个文档,它实际上很短。



Answer 3:

是的, from MODULE import OBJECT执行模块中的一切,然后有效地做OBJECT = MODULE.OBJECT 。 你可以告诉该模块已经被加载,在一定意义上,因为现在它驻留在sys.modules词典。



Answer 4:

正如上面提到的,是的。 你可以写简单的测试,以确保:

# 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'

我建议在每怀疑你的时间来写这样的测试如何一些进口或子类或其他thomething作品。



文章来源: Does “from-import” exec the whole module?