问题描述
假设有两个文件 a.py
和 b.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
执行后的绑定名称)