一、概念介绍

在介绍目录directory与包package的区别之前,先理解一个概念---模块

模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用。

目录(Directory):

Directory在pycharm中就是一个文件夹,放置资源文件,对应于在进行JavaWeb开发时用于放置css/js文件的目录,或者说在进行物体识别时,用来存储背景图像的文件夹。该文件夹其中并不包含_ _ init.py_ _文件

包(Package):

对于Python package 文件夹而言,与Dictionary不同之处在于其会自动创建__init__.py文件。 
简单的说,python package就是一个目录,其中包括一组模块和一个__init__.py文件。

二、导入模块

导入模块的方法:

  1. import module_name
  2. import module1_name,module2_name
  3. from module_name import * ---> 一般import * 不建议使用
  4. from module_name import m1,m2,m3 ---> m1module_name下面的方法或变量
  5. from module_name import logger as logger_a ---> 为导入的变量或方法取个别名,引用时直接用别名

1.同级目录下模块的导入:

在main_day41.py中导入para_day41.py,两种方法:

  1. #方法一: 相当于把para_day41.py中的所有代码拷贝过来赋值给变量para_day41,引用时直接用"该变量."
    import para_day41
  2. para_day41.show_para()

    运行结果:
    D:\python365\python3.exe D:/Pyexample/20190220Day4/main_day41.py
    in the para_day41
  1. #方法二: 只把para_day41.py中name变量和show_para方法拷贝过来,可以直接用(推荐用该方法)
    from para_day41 import name,show_para
  2. print(name)
  3. show_para()

    运行结果:
    D:\python365\python3.exe D:/Pyexample/20190220Day4/main_day41.py
    para_day41
    in the para_day41

2.不同级目录下模块的导入:

(1)导入子目录下的模块

main.py中导入day51目录下面para_day51.py

  1. import day51.para_day51
  2. day51.para_day51.show_para()
  1. from day51.para_day51 import *
  2. show_para()
  1. from day51 import para_day51
  2. para_day51.show_para()

    运行结果:
    D:\python365\python3.exe D:/Pyexample/20190220Day5/main.py
    in the para_day51

(2)导入上级目录下的模块

day22目录下面的main_day22.py导入day21目录下的para_day21.py

注:执行main_day22.py时,要导入day21目录下的para_day21.py,具体的搜索路径是这样的:

  首先,python需要在当前目录下去找para_day21.py,发现没有,然后就到sys.path列表中的每个路径下面去找:

  1. ['D:\\Pyexample\\20190220Day2\\day22', 'D:\\Pyexample', 'D:\\Pyexample\\W3', 'D:\\Pyexample\\20181113', 'D:\\Pyexample\\CSP\\cspmonitor', 'D:\\Pyexample\\python', 'D:\\python365\\python36.zip', 'D:\\python365\\DLLs', 'D:\\python365\\lib', 'D:\\python365', 'D:\\python365\\lib\\site-packages']

  结果仍没找到,所以就会报错:

  1. Traceback (most recent call last):
  2. File "D:/Pyexample/20190220Day2/day22/main_day22.py", line 21, in <module>
  3. import day21.para_day21
  4. ModuleNotFoundError: No module named 'day21'

  解决办法:需要手动将para_day21.py所在的父目录或上上级目录加到sys.path列表中,让python可以搜索到即可

  1. import sys,os
  2. print(sys.path)
  3.  
  4. p = os.path.dirname(os.path.dirname(os.path.abspath(file))) #获取要导入模块的上上级目录

  5. print(p)
  6.  
  7. sys.path.insert(0,p) #把获取到的上上级目录加到sys.path列表中
  8.  
  9. from day21 import para_day21

  10. print(para_day21.name)

  11. para_day21.show_para()

    运行结果:
    ['D:\Pyexample\20190220Day2\day22', 'D:\Pyexample', 'D:\Pyexample\W3', 'D:\Pyexample\20181113', 'D:\Pyexample\CSP\cspmonitor', 'D:\Pyexample\python', 'D:\python365\python36.zip', 'D:\python365\DLLs', 'D:\python365\lib', 'D:\python365', 'D:\python365\lib\site-packages']
    D:\Pyexample\20190220Day2
    ['D:\Pyexample\20190220Day2', 'D:\Pyexample\20190220Day2\day22', 'D:\Pyexample', 'D:\Pyexample\W3', 'D:\Pyexample\20181113', 'D:\Pyexample\CSP\cspmonitor', 'D:\Pyexample\python', 'D:\python365\python36.zip', 'D:\python365\DLLs', 'D:\python365\lib', 'D:\python365', 'D:\python365\lib\site-packages']
    para_day21
    in the para_day21

或者把要导入模块的父目录加到sys.path列表中

  1. p = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '\\day21' #获取要导入模块的父目录
  2. sys.path.insert(0,p)
  3. import para_day21
  4. print(para_day21.name)
  5. para_day21.show_para()

三、导入包

导入包的本质就是执行这个包下面的__init__.py文件

1.同级路径下包的导入:

main.py中导入包day31,直接用import 包名即可

  1. import day31

(1)__init__.py中没有内容时

  1. D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
  2.  
  3. Process finished with exit code 0

(2)__init__.py中有内容时:

  1. D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
  2. in the day31 __init__
  3.  
  4. Process finished with exit code 0

2.不同级路径下包的导入:

前提:需要将要导入的包所在的路径添加到sys.path列表中,方法同上,不再赘述。

3. 导入包中的模块

只是导入一个包并没有什么实际意义,包是用来从逻辑上组织模块的,所以实际项目中更多的是导入包中的模块,导入包中模块的方法:

  1. from Package1 import Module1
  2. from Package1 import Package2
    from Package1.Module1 import m1,m2 ---> m1,m2为模块中的变量或方法
    from Package1.Module1 import *
    import Package1.Module1
  3. import Package1.Package2

要导入的包及其模块结构如下:

(1)在main.py中导入包day31下面的para_day31.py或者para_day32.py模块

  1. import day31.para_day31,day31.para_day32
  2. day31.para_day31.show_para()
  3. day31.para_day32.show_para()
  4.  
  5. 运行结果:

  6. D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py

  7. in the day31 init

  8. in the para_day31

  9. in the para_day32
  10.  
  11. Process finished with exit code 0

或者:

  1. from day31 import para_day31,para_day32
  2. para_day31.show_para()
  3. para_day32.show_para()
  4.  
  5. 运行结果:

  6. D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py

  7. in the day31 init

  8. in the para_day31

  9. in the para_day32
  10.  
  11. Process finished with exit code 0

或者:

  1. from day31.para_day31 import show_para,name
  2. print(name)
  3. show_para()
  4.  
  5. 运行结果:

  6. D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py

  7. in the day31 init

  8. para_day31

  9. in the para_day31
  10.  
  11. Process finished with exit code 0

或者:

  1. from day31.para_day31 import *
  2. print(name)
  3. show_para()

(2)在main.py中导入包day31下面所有的模块,即全部导入

  1. from day31 import *
  2. para_day31.show_para()
  3. para_day32.show_para()
  4.  
  5. 运行结果:

  6. D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py

  7. in the day31 init

  8. Traceback (most recent call last):

  9. File "D:/Pyexample/20190220Day3/main.py", line 35, in <module>

  10. para_day31.show_para()

  11. NameError: name 'para_day31' is not defined
  12.  
  13. Process finished with exit code 1

此时,需要用到__init__.py文件中的__all__变量,在day31包中的__init__.py文件中定义如下:

  1. """
  2. @Author:janson
  3. @Date:2019/2/20
  4. @File:__init__
  5. """
  6.  
  7. print("in the day31 init")
  8.  
  9. all = ['para_day31','para_day32']

这时 from day31 import * 就会把注册在包__init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来:

再次运行就不会报错了:

  1. from day31 import *
  2. para_day31.show_para()
  3. para_day32.show_para()
  4.  
  5. 运行结果:

  6. D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py

  7. in the day31 init

  8. in the para_day31

  9. in the para_day32
  10.  
  11. Process finished with exit code 0

转载于:https://www.cnblogs.com/janson071/p/10407459.html

PyCharm中目录directory与包package的区别及相关import详解的更多相关文章

  1. python入门-PyCharm中目录directory与包package的区别及相关import详解

    一.概念介绍 在介绍目录directory与包package的区别之前,先理解一个概念---模块 模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用. 目录(Dict ...

  2. Python入门之PyCharm中目录directory与包package的区别

    对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,可能想要把它分成几个文件,以便逻辑更加清 ...

  3. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  4. 【翻译】Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)

    [翻译]Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解) . . .

  5. 图论中DFS与BFS的区别、用法、详解…

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  6. 图论中DFS与BFS的区别、用法、详解?

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  7. Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

    Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...

  8. MySQL中tinytext、text、mediumtext和longtext等各个类型详解

    转: MySQL中tinytext.text.mediumtext和longtext等各个类型详解 2018年06月13日 08:55:24 youcijibi 阅读数 26900更多 个人分类: 每 ...

  9. 机器学习中的隐马尔科夫模型(HMM)详解

    机器学习中的隐马尔科夫模型(HMM)详解 在之前介绍贝叶斯网络的博文中,我们已经讨论过概率图模型(PGM)的概念了.Russell等在文献[1]中指出:"在统计学中,图模型这个术语指包含贝叶 ...

随机推荐

  1. noip模拟36

    \(\color{white}{\mathbb{荷花映日,莲叶遮天,名之以:残荷}}\) 今天再次翻车掉出前十 开题看错 \(t1\) 以为操作2的值固定发现是个简单题,然后 \(t2\) 开始大力 ...

  2. Hounter

      这题是概率与期望,不是很熟,所以冲了两篇题解才来写总结.   首先可以发现1猎人死的轮数是他之前死了的列人数加一.   那么题目转化为求先于一号猎人死的猎人数的期望值.   考虑这样一个事情,就是 ...

  3. 交换机之vlan详解

    一.为什么需要VLAN 1.1.什么是VLAN? VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算 ...

  4. el-upload + accept限制上传的文件格式

    /**  * kevin 2021/1/4  * @description el-upload + accept限制上传的文件格式  * @param e 校验的类型  * @returns {str ...

  5. .Net性能调优-MemoryPool

    简单用法 //获取MemoryPool实例,实际返回了一个ArrayMemoryPool<T> MemoryPool<char> Pool = MemoryPool<ch ...

  6. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  7. RocketMQ详解(四)核心设计原理

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  8. leetcode8 字符串转换为整数

    最笨的办法实现 一步步判断 /** * @param {string} s * @return {number} */ var myAtoi = function(s) { s = s.trim() ...

  9. MapReduce原理深入理解(一)

    1.MapReduce概念 1)MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. 2)MapReduce是分布式运行的,由两个阶段组成:Map和R ...

  10. Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(1)- 创建Jenkins容器、安装Python环境、安装项目依赖类库、安装Allure报告插件

    前言: 本文实操笔记参照菠萝笔记,安装过程中的坑大家可以参考下 创建Jenkins容器 # 下载Jenkins镜像 [root@localhost ~]# docker pull jenkins/je ...