[语言基础] 模块、包遇到的问题

准备:目录结构与说明

top
│  main.py
│  
├─father1
│      module1.py
│      module1_1.py
│      __init__.py
│      
└─father2
    │  module2.py
    │  __init__.py
    │  
    └─son2
            module2_son2.py
            __init__.py
#module1.py 
name = 'father1'

#module1_1.py
age = '12'

#module2.py
name = 'father2'

#module2_son2.py name = 'son2'

 

 

模块导入

#从 文件夹father1中 导入 模块module1
from father1 import module1
print(module1.name)  #father1

 

 

包导入

'''
import 风格
缺点:使用的时候需要再重复一遍import的内容
'''
import father1.module1
print(father1.module1.name) #father1



'''
from xxx import xxx 风格
'''
#从 文件夹father1 -> 模块module1 中导入 变量name
from father1.module1 import name
print(name)  #father1

#从father2\son2文件夹中导入模块module2_son2
from father2.son2 import module2_son2
print(module2_son2.name)  #son2

问题1:可不可以直接import father1呢?

->不行,不能直接import文件夹,import的必须是模块或者变量

问题2:那么我想import father1,怎么办呢?

top
│  main.py
│  
├─father1
│      module1.pymodule1_1.py
│      __init__.py
│      
└─ 略...
# father1 -> __init__.py
from . import module1,module1_1

# main.py
import father1
print(father1.module1.name)

问题3:在module1.py中相对导入同目录的模块module1_1,然后运行module1.py,结果报错: cannot import name 'module1_1' from '__main__' (.\module1.py) ,如何解决?

top
│  main.py
│  
├─father1
│      module1.py
│      module1_1.py
│      __init__.py
│      
└─ 略...
# module1.py
from . import module1_1
'''
运行module1.py:
..略..\top\father1> python .\module1.py
Traceback (most recent call last):
  File ".\module1.py", line 1, in <module>
    from . import module1_1
ImportError: cannot import name 'module1_1' from '__main__' (.\module1.py)
'''

 答:运行顶层文件模块 -> main.py

# main.py
from father1 import module1
print(module1.module1_1.age)

原因:参考Python学习手册p583

相对导入适用于只在包内导入。这种功能的模块搜索路径修改只应用于位于包内的模块文件中的import语句。位于包文件之外的通常的导入将像前面所介绍的那样工作,首先自动搜索包含了顶级脚本的目录。

posted @ 2019-09-24 23:58  remly  阅读(147)  评论(0编辑  收藏  举报