为什么 Python 看不到以前导入的模块?

问题描述

假设有两个文件 a.pyb.py。它们的内部如下:

# a.py
from b import foo

foo()

# b.py
import os

def foo():
    print(os.cwd())

这工作得很好,但为什么 a.py 无法隐式地看到 b.py 的导入供自己使用:

# a.py
import b

def bar():
    print(os.cpu_count())  # fails

b.foo()
bar()

# b.py
import os

def foo():
    print(os.cwd())

我正在阅读 import system 文档,但一直无法弄清楚。 os 导入存在于 b.py 的命名空间中,但它对 a.py 不可用,我不确定为什么。 globals() 方法是在模块级别,因此给定 rules,模块之间是否没有共享导入(不使用 __all__* 导入)?每个模块都有自己的导入命名空间吗?

解决方法

每个模块都有自己的命名空间。 import 语句做两件事:如果当前进程中尚未导入模块,则加载并执行该模块。之后它的名字被绑定到导入语句所在的本地命名空间。

如果一个模块已经在同一个进程中被导入,它不会被重新加载,但导入语句中的名称被导入语句正确绑定。

正确的做法是在您的 import os 模块上添加另一个 a - 但如果你做 import b 你可以使用 b.os.cwd() (因为“os”是模块 b 执行后的绑定名称)