from-import"会执行整个模块吗?
好的,我知道 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
然后在其他模块中使用它时,我还需要再次导入 logging:
import logging
logger = logging.getlogger("mine")
# log stuff
但我想知道的是,如果我使用 from utils import awesome_func
,我的日志记录器会被正确设置吗?而且 logging 模块会按照我想要的方式设置吗?
这个问题同样适用于其他一些通用的设置。
4 个回答
3
是的,from MODULE import OBJECT
这行代码会先执行模块里的所有内容,然后实际上就相当于 OBJECT = MODULE.OBJECT
。你可以理解为模块已经被加载了,因为它现在在 sys.modules
这个字典里。
7
你的问题的答案是肯定的。
想要更好地理解导入过程,可以看看Frederik Lundh的文章“导入Python模块”。
特别是,我会引用一些能回答你问题的部分。
Python是如何导入一个模块的?
[...]
- 创建一个新的空模块对象(这其实就是一个字典)
- 把这个模块对象放进sys.modules字典里
- 加载模块的代码对象(如果需要,先编译模块)
- 在新模块的命名空间中执行模块的代码对象。所有由代码赋值的变量都可以通过模块对象访问。
关于使用from-import
的部分:
导入模块的方法有很多种
[...]
from X import a, b, c会导入模块X,并在当前命名空间中创建对指定对象的引用。换句话说,你现在可以在你的程序中使用a、b和c了。
注意我省略了一些内容。整篇文章值得一读,实际上也很短。
6
看起来答案是肯定的:
$ 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
$