Python 包的引入顺序到底是怎样的?

文件结构如下:

$ 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:osplatform 都是内置模块, 当 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
扬帆大鱼
浏览 1038回答 3
3回答

婷婷同学_

如果是python环境那么,导包会先从同级目录去找你导入的模块。如果找不到,回去python内置的第三方包去查找模块。完整的查找方式为:同级方法<--同级模块<--同级包<--第三方包

慕桂英546537

python 运行时会预转载一些module,你用sys.modules print 一下就知道了。如果已经加载就不会再有搜索一说了~
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python