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

标签 python python-internals

假设有两个文件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,但无法弄清楚这一点。 os import 存在于 b.py 的命名空间中但它不适用于 a.py我不确定为什么。 globals()方法是在模块级别,所以给定 rules ,模块之间是否没有共享导入(不使用 __all__* 导入)?每个模块都有自己的导入命名空间吗?

最佳答案

每个模块都有其命名空间。
import 语句做了两件事:如果一个模块在当前进程中还没有被导入,它就会被加载并执行。之后,它的名称将绑定(bind)到 import 语句所在的本地命名空间。
如果一个模块已经在同一个进程中被导入,它不会被重新加载,但导入语句中的名称被导入语句正确绑定(bind)。
正确的做法是添加另一个import os在您的 a 上模块 -
但如果你这样做 import b您可以使用 b.os.cwd() (因为“os”是模块b执行后的绑定(bind)名称)

关于python - 为什么 Python 看不到以前导入的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66281112/

相关文章:

python - 如何使用 python 从公共(public)谷歌表中获取数据?

python - `<attribute ' xxx' of 'C' 对象 >` mean in the output of ` C.__dict__` 是什么意思?

python - 关闭 __class__

python - CPython 中的全局解释器锁 (GIL) 是什么?

python - Python的代码对象是什么类型?

python - 将整数集合存储在列表中

python - 更改 Pandas 中的默认选项

Python字典迭代器性能

python - 警告 : erroneous pipeline: no element "kvssink"

python - 使用 python 和 __repr__ 打印嵌套对象