Art*_*tur 1 python python-module pytest
我在 中创建了一个虚拟模块模块/tmp,insert它的路径 do sys.path,导入虚拟模块,del当它不再需要时,删除它sys.path,我仍然可以导入它。为什么?
考虑这个 pytest 夹具代码及其注释:
def test_function(temp_dir):
with open(os.path.join(temp_dir, 'dum.py'), 'w') as f:
f.write("""
class A:
\"\"\"
test docstring
\"\"\"
test: int
test_2: str = "asdf"
class B(A):
pass
""")
import sys
sys.path.insert(1, temp_dir)
assert temp_dir in sys.path # assertion passes
# noinspection PyUnresolvedReferences
import dum # import successful
yield dum
# teardown executed after each usage of the fixture
del dum # deletion successful
sys.path.remove(temp_dir) # removing from path successful
assert temp_dir not in sys.path # assertion passes
with pytest.raises(ModuleNotFoundError): # fails - importing dum is successful
import dum
Run Code Online (Sandbox Code Playgroud)
为什么?我如何实际删除它?即使我通过执行强制 sys.path 为空,它也会发生sys.path = []。dum.py项目目录中没有任何位置。我错过了什么吗?即使在删除后,Python 是否也会缓存导入的模块?
导入一次模块后,下次要导入时,Python 首先检查已导入模块的集合,并使用已加载的模块。因此,第二次导入一个模块时,sys.path甚至没有咨询。
如果您考虑一下,这很重要:假设您直接导入了一些模块,并且每个模块都使用了一些其他模块,依此类推。如果必须从磁盘检索模块并进行解析,则每次import遇到语句时,您都将花费大量时间来等待模块加载。
还值得注意的是,模块 A 第二次导入模块 B 时,实际上什么也没发生。有多种方法可以显式重新加载已加载的模块,但通常您不想这样做(具有实时更新的 Web 服务器是一个明显的例外)。
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |