• Python中模块与包的导入(朴实易懂版的总结)


    这几天,被python包与模块的导入问题,折磨的不行,以前想的很简单,其实不然,经查资料研究,特总结如下:

    基本注意点

    1. 模块:一般指一个py文件;包:含有许多py文件的文件夹,含有 或不含有(Python3中允许)__init__文件。
    2. 凡是在导入时带点的,点的左边都必须是一个包 (import a.fun1 其中a为py文件)这种导入形式是错误的。
      2.from a import fun1 a为一个py文件,fun1为该文件的属性或方法,这种导入形式是可以的。
    3. 一般来说 import 后面不能带点,如:(from a import b.c是错误语法)
    4. 导入模块时,是将模块的py文件导入进去(执行);导入包时,只会执行包中的__init__文件中的代码,故导入包时一般要导入到最底层,即from dir1.dir2.dir3 import py文件或者类、方法、属性,只有这样才能找到。但是你可以通过先导入一个包,然后在包的文件中的__init__中写相关的import语句(可以绝对,也可以相对),这样也可以通过import 包名 的方式将包中的东西导入进去。
      例如:

    文件结构

    文件结构示意图

    示例1

    • 以p0.py为直接执行文件,如在p0文件输入:
    import bin
    
    • 在bin文件夹的__init__.py文件中输入:
    from . import  dir  # 相对导入   或者绝对导入: from bin  import dir 
    
    • 最后,在dir 的__init__.py文件中输入:
    from . import p3 
    # 注意,这时的绝对导入必须为:
    from bin.dir import p3
    # 因为:后面第四条的给出了原因,dir并不在此时的sys.path中
    
    • 通过以上语句,就能实现从po文件中,仅仅通过import bin 就能导入p3文件去po里面
    1. 直接执行某个py文件时,会将当前py文件所在的目录添加到sys.path中,而其它模块被被导入其中时并不会将其它模块所在的目录放进sys.path中。
    2. 用相对路径导入: “.”表示当前目录,“..”表示上一层目录,注意这里的当前表示要导入的某个py文件所在的目录,上一层同理。相对导入时不用考虑是否在sys.path中,一般写在一个包中的__init__文件中。常用于包外使用,从包外某个py文件导入包内某些文件。见示例1的模式

    Python import 的搜索路径(即sys.path)

    • 在当前目录下搜索该模块,(注意在pycharm中,pycharm会将你的项目路径添加到sys.path中),从这里看出,你所导入到的模块或者包或者模块所在的包,必须是与直接执行的文件同级,
      例如 示例1:直接直接执行p0.py sys.path 添加的就是 test目录,那么只有 bin、main 能搜索到,所以from bin.dir import p3是可以的。
    • 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索
    • 在 Python 安装路径的 lib 库中搜索

    软件开发规范


    这是程序文件结构的一般规范,里面涉及到包与模块的导入问题

    • ①为了能在bin文件下的start.py文件中引入core文件夹下的core.py中的main()函数,(即跨同一目录下的 两个包导入,一般需要将两包的共有目录添加到sys.path中)
      start.py文件代码为:(为通用格式)
    import os
    import sys
    sys.path.append(os.path.dirname(os.getcwd()))
    from core import  core  # 注意第一个core为包名,第二为py文件名
    if __name__ == '__main__':
        core.main()
    
    • ②假如,core文件中写了两个py文件,一个为core.py,另一个为 log_in.py ,为了能在core.py中导入log_in模块,
    # 方法1
    import log_in
    

    方法1是错的,因为程序的主入口(直接执行的)为start.py文件,又由于添加了项目目录(soft)到sys.path中,故此时sys.path中含有 bin、soft、其它python解释器文件路径,所以无法导入

    # 方法2
    from core import log_in
    

    方法2是对的 ,因为start.py中已添加项目目录(soft)到sys.path中
    参考:https://www.cnblogs.com/linhaifeng/articles/6379069.html

  • 相关阅读:
    【BZOJ4318】OSU! 期望DP
    【BZOJ2956】模积和 分块
    【BZOJ4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
    【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治
    【BZOJ3555】[Ctsc2014]企鹅QQ hash
    【BZOJ3238】[Ahoi2013]差异 后缀数组+单调栈
    【BZOJ2287】【POJ Challenge】消失之物 背包动规
    【BZOJ4517】[Sdoi2016]排列计数 组合数+错排
    【BZOJ4551】[Tjoi2016&Heoi2016]树 并查集
    【BZOJ2783】[JLOI2012]树 DFS+栈+队列
  • 原文地址:https://www.cnblogs.com/greatljg/p/11156786.html
Copyright © 2020-2023  润新知