包和模块的导入问题

本质:导入模块的本质就是把python文件解释一遍,
         导入包的本质就是把包文件下面的init.py文件运行一遍。
 
         1)同目录下模块的导入
            #同级目录下模块的导入
 
            import module_name   #直接导入模块
            import module1_name,module2_name  #导入多个模块  使用:模块名.函数名
            from modeule_name import * #导入模块中所有函数和变量等。。。不推荐使用
            from modeule_name import m1,m2,m3 #只导入模块中函数m1,m2,m3 使用:直接使用m1,m2,m3就可以
            from modeule_name import m1 as m #导入module_name模块中函数m1并且将函数重新复制给m 使用:直接用调用m
 
         2)不同目录下模块的导入
            #不同目录下模块的导入  当前文件main.py
 
            #目录结构
            # ├── Credit_card
            # │
            # ├── core 
            # │   ├── __init__.py
            # │   └── main.py  # 当前文件
            # ├── conf 
            # │   ├── __init__.py
            # │   └── setting.py
            # │   └── lzl.py
             
            import sys,os
            #获取当前目录的上上级目录绝对路径,也就是Credit_card
            credit_card_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
            #把Credit_card目录加入到系统路径
            sys.path.insert(0,credit_card_path)
 
            #查看系统环境路径
            print(sys.path)
 
            例子:
                如果main文件夹要用conf文件夹下的setting文件,直接导入是不行的
                应该:
                    fron conf import setting
                    setting.函数名()  #这样执行setting模块中的函数
 
        3)不同目录下模块连环导入
            #不同目录多个模块之间互相导入
 
            #目录结构
            # ├── Credit_card
            # │
            # ├── core 
            # │   ├── __init__.py
            # │   └── main.py  # 当前文件
            # ├── conf 
            # │   ├── __init__.py
            # │   └── setting.py
            # │   └── lzl.py
 
            如果在setting文件中调用模块lzl.py,可以用语句 import lzl,但是如果这样,
            我们在main.py文件中调用setting文件时,就会报错#ImportError: No module named 'lzl'
            这个时候我们需要将 import lzl  换为  from . import lzl
            然后main.py文件中调用setting文件时,才可以正常执行。
 
        4)不同目录多个模块相互导入,用相对路径
 
            Root
                ├── Credit_card
                        ├── README.md
                        ├── core
                        │   ├── __init__.py
                        │   └── main.py
                        ├── conf
                        │   ├── __init__.py
                        │   └── setting.py
                        │   └── lzl.py    
 
 
            lzl.py文件内容:  
                    def name():
                        print("name is lzl")
 
            setting.py文件内容:
                    #当前文件settings,调用lzl.py模块  相对路径
                    from . import lzl       #通过相对路径导入模块lzl
                    def set():
                        print("in the settings")
                        lzl.name()   #运行lzl模块下的函数
 
                    set()  #执行函数set
 
            Core目录下的文件中的mian.py文件内容:
                    #不同目录之间连环import 当前文件main.py  相对路径
 
                    from Root.Credit_card.conf import settings
                    settings.set()   #执行settings下的函数
 
 
            注意:
                lzl.py以及settings.py文件未变,main.py文件去掉了繁杂的sys.path添加的过程,
                直接执行from Root.Credit_card.conf import settings,使用相对路径,更加
                简洁方便!

 

posted @ 2018-08-06 15:51  小学弟-  阅读(126)  评论(0编辑  收藏  举报