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

Why can Python not see previously imported modules?

假设有两个文件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 docs but haven't been able to figure this out. The os import exists in the namespace of b.py but it's not available to a.py and I am unsure why. The globals() method is at the module level, so given the rules,模块之间是否没有共享导入(不使用 __all__* 导入)?每个模块都有自己的导入命名空间吗?

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

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

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