• 是一群模块文件+__init__文件的文件夹。python3中没有__init__文件也叫作包,python2中包必须有__init__文件否则会报错

    导入包的本质就是就是执行该包下的init文件。

    导入:

    1.用绝对路径导入:以项目文件为基准

    题目要求:在cmd中的day2中导入api中day1中的d1函数。

    你可能会这样写

    from package.api.day1 import d1
    
    def d2():
        print('这是day2')

    首先这样写在pycharm中运行没问题,因为pycharm把项目pake的绝对路径自动添加到sys.path中,但是你要知道,等你在linux系统中运行的时候是没有pycharm的,没有帮你把路径添加到sys.path中。

    所以我们要自己添加

    import os,sys
    p_path=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) #__file__在pycharm中会打印出绝对路径,在linux是相对路径,所以这里要用abspath转换一下
    sys.path.append(p_path)
    from package.api.day1 import d1
    def d2():
        print('这是day2')

    我们自己拼接的这个路径是动态的路径,跟着文件夹会变动,而pycharm提供的,是个死的不会变动。

    我们再看一个例子

    题目要求:从day2中导入day31已知day1文件中import day3,我们执行day2你会发现报错

    ModuleNotFoundError: No module named 'day3'

    这是因为什么呢,这是因为导入路径出现了错误,因为我们把pake文件夹的路径放到了sys。path中所以所有的导入要用package的路径开始,应该在day1中这样写

    from package.api import day3

    __init__.py: 导入包实质上是导入包下面的init文件

    题目要求,在p_test文件中导入day5文件下的任意模块

    首先在package的包中的init文件中写入

    from package import day5
    from package import day6
    然后再day5包中的init 文件中写入
    from package. day5 import text1
    from package. day5 import text3
    然后再day6包中的init 文件中写入
    from package. day6 import text2
    from package. day6 import text4

    这样在p_test文件中这样写:
    import package
    package.day5.text1.test1()

    结果:

    in the test1

    如果你不用上面的init方法你可以这样写:

    import package.day5.text1
    package.day5.text1.test1()

    结果:

    in the test1

    绝对路径的局限性:如果你把你写的包放到另一个文件中,里面的程序会发生错误。在pycharm中不会发生错误,因为,它替你把目录自动更新了,但是在lniux系统中会发生错误。

    2.用相对路径导入,只能在包外部使用,好处:不用关心包内代码的导入关系会发生错误(多用相对导入),

    把上面的文件改为:

    首先在package的包中的init文件中写入

    from .import day5
    from . import day6
    然后再day5包中的init 文件中写入
    from . import text1
    from . import text3
    然后再day6包中的init 文件中写入
    from .import text2
    from . import text4
    这样在p_test文件中这样写:
    import package
    package.day5.text1.test1()

    结果:

    in the test1
  • 相关阅读:
    关于C语言变量初始化的两个问题的笔记
    源自StackOverflow:找到LIST中第一个降序成员,有助于对扩展方法、IEnumerable<T>、泛型的理解
    《PERL高效编程》学习笔记(1)【关于裸字处理】
    C#出题库项目的总结(2)
    遇到的浏览器兼容问题及应对方法
    春招面试小记
    关于团队成员的退出引发的一些回忆及感悟
    C#出题库项目的总结(1)
    写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来
    重定向和管道符
  • 原文地址:https://www.cnblogs.com/sticker0726/p/7955045.html
Copyright © 2020-2023  润新知