from-import"会执行整个模块吗?

2 投票
4 回答
864 浏览
提问于 2025-04-15 12:50

好的,我知道 from-importimport 是“完全相同”的,除了它们在命名空间的处理上有些不同。

我之所以问这个问题,是因为我有一个 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是如何导入一个模块的?

[...]

  1. 创建一个新的空模块对象(这其实就是一个字典)
  2. 把这个模块对象放进sys.modules字典里
  3. 加载模块的代码对象(如果需要,先编译模块)
  4. 在新模块的命名空间中执行模块的代码对象。所有由代码赋值的变量都可以通过模块对象访问。

关于使用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

$ 

撰写回答