文件结构如下:
$ tree .
.
├── main.py
├── os.py
└── platform.py
main.py:
import platform
import os
import sys
print('Now in main, Start`enter code here` to Exec following')
print(os.getcwd())
print(sys.modules['platform'].__file__)
print(platform.processor())
os.py:
print('Now in os.py module')
platform.py:
print('Now in platform.py module')
当我运行 python main.py
,结果如下:
$ python main.py
Now in platform.py module
Now in main, Start to Exec following
/Users/michael/Code/00-Temp/pkg_import
/Users/michael/Code/00-Temp/pkg_import/platform.py
Traceback (most recent call last):
File "main.py", line 9, in <module>
print(platform.processor())
AttributeError: module 'platform' has no attribute 'processor'
问题1:os
和 platform
都是内置模块, 当 import os
,默认走到了内置模块,但是 import platform
, 却获取了同级目录下的 plarform
,为何出现这个现象呢?
问题2:同样的脚本,我在 Pycharm 中直接运行 main.py ,却报这个错误:
/Users/michael/anaconda3/bin/python /Users/michael/Code/00-Temp/pkg_import/main.py
Now in os.py module
Fatal Python error: initsite: Failed to import the site module
Traceback (most recent call last):
File "/Users/michael/anaconda3/lib/python3.7/site.py", line 570, in <module>
main()
File "/Users/michael/anaconda3/lib/python3.7/site.py", line 547, in main
known_paths = removeduppaths()
File "/Users/michael/anaconda3/lib/python3.7/site.py", line 126, in removeduppaths
dir, dircase = makepath(dir)
File "/Users/michael/anaconda3/lib/python3.7/site.py", line 91, in makepath
dir = os.path.join(*paths)
AttributeError: module 'os' has no attribute 'path'
Process finished with exit code 1
1.执行 python 就会把 os 引入进来了,不过是解释器做的,我们在程序中要使用之前,虽然还需要再显示的
import os
一下,但是其实解释器已经缓存过了!解释器启动的时候会导入一些标准库(注意是标准库,不是内置库)。而且,它缓存的时候,默认就是使用的built-in module
,因为可能就默认了,不让你使用同名的模块吧2.可以在修改 main.py 为:
这时候可以看到,里边已经有
os
缓存了,所以,即使下面再import os
,也不会重加载了。除非你后面在执行import os
之前先del sys.modules['os]'
,这时候,built-in module
就会被同目录的os.py
屏蔽了。3.内置模块不是标准库,是指
sys.builtin_module_names
输出的字符串元祖。解释器启动时确实会加载buit-in module
,但是,执行print(sys.builtin_module_names)
发现,os
并不是built-in module
。所以,解释器执行 python 文件时,不仅仅是加载了内置模块的!!!使用sys.modules
可以看到实际启动时加载的所有模块。参考: