为何Idle无法导入启动后创建/修改的.py文件内容?
问题:Idle中修改模块后无法导入新增内容的原因
复现步骤
- 创建
myLib.py文件,内容如下:
#!/usr/bin/env python3 pre_launch_str = "Pre-launch!" # post_launch_str = "Post-launch!"
- 从文件所在文件夹启动Idle
- 执行
from myLib import pre_launch_str可正常导入使用 - 保持Idle运行
- 通过其他应用/终端修改
myLib.py,取消post_launch_str的注释以新增该对象 - 执行
from myLib import post_launch_str会触发错误:
Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: cannot import name 'post_launch_str' from 'myLib' (/home/myUser/myLib.py)
该现象在Linux(zsh)+Python3.10、Python3.5及MacOS环境中均存在,请问原因是什么?
原因解释
这是Python模块导入机制的正常表现,和Idle本身无关:
- Python进程在第一次导入模块时,会将模块文件编译为字节码(生成
.pyc文件),并把整个模块对象加载到内存中。 - 后续所有对该模块的导入操作,都会直接复用内存中已加载的模块实例,不会重新读取磁盘上的最新文件内容。
- Idle本质是一个持续运行的Python交互式进程,你修改磁盘上的
myLib.py后,Idle进程内的模块依然是启动后第一次导入时的旧版本,所以找不到新增的post_launch_str。
如果需要在Idle中使用修改后的模块,可以执行import importlib; importlib.reload(myLib)重新加载模块,之后就能导入新增内容。
内容的提问来源于stack exchange,提问作者Adam Smooch
相关产品推荐
相关产品推荐

