浅谈Python中文件夹和python package包的区别


Posted in Python onJune 01, 2020

pycharm右键新建时会有目录(文件夹)和python package两个选项,这两个到底有什么不同呢

浅谈Python中文件夹和python package包的区别

1.原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有__init__.py那么它就是这个包的子包了。

当你将一个包作为模块导入(比如从 xml导入 dom)的时候,实际上导入了它的__init__.py 文件。

2.而目录跟包唯一不同的就是没有__init__.py 文件,一个包是一个带有特殊文件__init__.py 的目录,而__init__.py 文件定义了包的属性和方法。

其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果__init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。

补充知识:Python类、模块、包的区别

类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。

模块

模块,在Python可理解为对应于一个文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。这样的语义用法使模块看起来很像类或者名字空间,可将module_name 理解为名字限定符。模块名就是文件名去掉.py后缀。

client.py

def func():
  print "hello world!"

main.py

import client
if __name__ == '__main__':
  print __name__
  client.func()
  print client.__name__
 
>>python main.py ---> result:

__main__

hello world!

client

模块属性__name__,它的值由Python解释器设定。如果脚本文件是作为主程序调用,其值就设为__main__,如果是作为模块被其他文件导入,它的值就是其文件名。

每个模块都有自己的私有符号表,所有定义在模块里面的函数把它当做全局符号表使用。

模块可以导入其他的模块。通常将import语句放在模块的开头,被导入的模块名字放在导入它的模块的符号表中。

from module import names 可以直接从模块中导入名字到符号表,但模块名字不会被导入。

from module import * 可以把模块中的所有名字全部导入,除了那些以下划线开头的名字符号。不建议使用,不清楚导入了什么符号,有可能覆盖自己定义的东西

内建函数dir()可以查看模块定义了什么名字(包括变量名,模块名,函数名等):dir(模块名),没有参数时返回所有当前定义的名字

模块搜索路径

当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)

sys.path的初始值来自于以下地方:

包含脚本当前的路径,当前路径

PYTHONPATH

默认安装路径

sys.path初始化完成之后可以更改

编译过的Python文件: .pyc文件

built-in 模块

上面的例子中,当client被导入后,python解释器就在当前目录下寻找client.py的文件,然后再从环境变量PYTHONPATH寻找,如果这环境变量没有设定,也不要紧,解释器还会在安装预先设定的的一些目录寻找。这就是在导入下面这些标准模块,一切美好事情能发生的原因。

这些搜索目录可在运行时动态改变,比如将module1.py不放在当前目录,而放在一个冷僻的角落里。这里你就需要通过某种途径,如sys.path,来告知Python了。sys.path返回的是模块搜索列表,通过前后的输出对比和代码,应能理悟到如何增加新路径的方法了吧。非常简单,就是使用list的append()或insert()增加新的目录。

#module2.py
import sys
import os

print sys.path
workpath = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.insert(0, os.path.join(workpath, 'modules'))
print sys.path

其他的 要点

模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。

模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。

通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 _init_.py。然后是一些模块文件和子目录,假如子目录中也有 _init_.py 那么它就是这个包的子包了。

在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。_init_.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。

可以从包中导入单独的模块。

1). import PackageA.SubPackageA.ModuleA,使用时必须用全路径名

2). 变种: from PackageA.SubPackageA import ModuleA, 可以直接使用模块名而不用加上包前缀。

3). 也可以直接导入模块中的函数或变量:from PackageA.SubPackageA.ModuleA import functionA

import语句语法:

当使用from package import item时,item可以是package的子模块或子包,或是其他的定义在包中的名字(比如一个函数、类或变量)

首先检查item是否定义在包中,不过没找到,就认为item是一个模块并尝试加载它,失败时会抛出一个ImportError异常。

当使用import item.subitem.subsubitem语法时,最后一个item之前的item必须是包,最后一个item可以是一个模块或包,但不能是类、函数和变量

from pacakge import *

如果包的__init__.py定义了一个名为__all__的列表变量,它包含的模块名字的列表将作为被导入的模块列表。

如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。

python包是:

包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。

通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。

常见问题:

引入某一特定路径下的模块

使用sys.path.append(yourmodulepath)

将一个路径加入到python系统路径下,避免每次通过代码指定路径

利用系统环境变量 export PYTHONPATH=$PYTHONPATH:yourmodulepath,

直接将这个路径链接到类似/Library/Python/2.7/site-packages目录下

好的建议

经常使用if__name__ == ‘_main_',保证你写包既可以import又可以独立运行,用于test。

多次import不会多次执行模块,只会执行一次。可以使用reload来强制运行模块,但不提倡。

包(package)

为了组织好模块,将多个模块分为一个包。包是python模块文件所在的目录,且该目录下必须存在__init__.py文件。常见的包结构如下:

package_a
├──__init__.py
├── module_a1.py
└── module_a2.py
package_b
├──__init__.py
├── module_b1.py
└── module_b2.py
main.py

如果main.py想要引用packagea中的模块modulea1,可以使用:

from package_a import module_a1
import package_a.module_a1

如果packagea中的modulea1需要引用packageb,那么默认情况下,python是找不到packageb。我们可以使用sys.path.append('…/'),可以在packagea中的__init__.py添加这句话,然后该包下得所有module都添加* import __init_即可。

以上这篇浅谈Python中文件夹和python package包的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python冒泡排序算法的实现代码
Nov 21 Python
python实现socket端口重定向示例
Feb 10 Python
python实现telnet客户端的方法
Apr 15 Python
初步解析Python下的多进程编程
Apr 28 Python
老生常谈Python序列化和反序列化
Jun 28 Python
transform python环境快速配置方法
Sep 27 Python
linux下python中文乱码解决方案详解
Aug 28 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
Feb 18 Python
Python tornado上传文件的功能
Mar 26 Python
tensorflow图像裁剪进行数据增强操作
Jun 30 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 Python
python处理json数据文件
Apr 11 Python
python 通过文件夹导入包的操作
Jun 01 #Python
Python matplotlib可视化实例解析
Jun 01 #Python
python代码如何注释
Jun 01 #Python
python爬虫实例之获取动漫截图
May 31 #Python
如何利用Python识别图片中的文字
May 31 #Python
Python模拟登入的N种方式(建议收藏)
May 31 #Python
Python多线程正确用法实例解析
May 30 #Python
You might like
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
Python字符遍历的艺术
2008/09/06 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
Python的Flask开发框架简单上手笔记
2015/11/16 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
如何基于python生成list的所有的子集
2019/11/11 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
美国名牌太阳镜折扣网站:Eyedictive
2017/05/15 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
大学生逃课检讨书
2015/05/04 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
公司酒会主持词
2015/07/02 职场文书
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis