为什么 Python 看不到以前导入的模块?
Why can Python not see previously imported modules?
假设有两个文件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 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
执行后的绑定名称)
假设有两个文件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 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
执行后的绑定名称)