• ## Python中的Package和Jupyter中import包问题


    前言

    关于python包的一些知识


    Java中的package概念

    我们知道在java中的import package概念, java中的包就是一个目录,里面包含着子目录,子目录套着子目录,当需要引入下层包的时候,需要加一个点以表示分层的概念例如

    ├─ aaa
    ├─bbb
    │ └─ccc
    └─ddd

    我们在根目录下,当我们想引用ccc中的ccc中的class的时候,我们可以这样写

    import bbb.ccc.* 
    

    Python中的包

    总体来说python的包机制与Java的差不多,都是目录的形式,不过里面都是py文件

    一个标准的Python包

    一个标准的Python Package A 应该至少在A目录下包含__init.py__ 文件,例如

    sound/                          Top-level package
          __init__.py               Initialize the sound package
          formats/                  Subpackage for file format conversions
                  __init__.py
                  wavread.py
                  wavwrite.py
                  aiffread.py
                  aiffwrite.py
                  auread.py
                  auwrite.py
                  ...
          effects/                  Subpackage for sound effects
                  __init__.py
                  echo.py
                  surround.py
                  reverse.py
                  ...
          filters/                  Subpackage for filters
                  __init__.py
                  equalizer.py
                  vocoder.py
                  karaoke.py
    

    这样的sound包中包含了了3个包,首先sound目录下有_init_.py文件,sound包中包含formats, effects和filters三个包,formats,effects 和filters。 init.py的作用主要是在import python的包的时候做一些初始化工作例如可以这样写

        __all__ = ['wavread', 'wavwrite']
    

    如果在formats的init里面写了这句话,表明from sound.formats import * 的时候, 只会引入wavwrite, wavread两个Module。

    其他py文件对Module的引用


    引用python包的语法主要有两种

    import sound
    

    或者

    from sound.formats import func
    

    对于第一种写法,表明引入的是整个module,接下来可以使用sound.format.func, 对于第二种写法,from后面必须精确到某个py文件,import表示引入py文件中的某个对象(或是某个类和函数,当然python中函数也是对象)注意,这么写是相对路径,也就是说,能不能引入到你想要的包,和你当前py文件在哪个包很有关系,例如现在在echo.py中想引入formats/wavread.py中的func,必须这么写

    from ..formats.wavread import func
    func()
    

    参考了这篇博文后需要注意,含有相对路径的py文件是不能直接运行的(包括直接python echo.py或是在sublime中cntl + B等等方法),原因是直接执行python脚本会让该脚本的_name__值变成_main__会影响到相对路径的引用,报错__Attempted relative import in non-package,因此,若是一定需要执行某脚本,必须手动的将当前目录的上层引入,代码如下

    import sys
    sys.path.append('../')
    from ..formats.wavread import func
    func()
    

    这样就可以直接运行


    待续未完。。。

  • 相关阅读:
    WAF、流控设备、堡垒机
    IPS入侵防御系统
    IDS入侵检测系统
    OSI安全体系结构
    边界网关协议BGP
    路由选择协议(RIP/OSPF)
    路由协议之OSPF
    路由协议之RIP
    Social engineering tookit 钓鱼网站
    YII框架中的srbac权限管理模块的安全与使用(版本是1.1.20)
  • 原文地址:https://www.cnblogs.com/princecoding/p/5992897.html
Copyright © 2020-2023  润新知