浅谈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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
python求解数组中两个字符串的最小距离
Sep 27 Python
python 梯度法求解函数极值的实例
Jul 10 Python
Python SELENIUM上传文件或图片实现过程
Oct 28 Python
python与mysql数据库交互的实现
Jan 06 Python
Python list运算操作代码实例解析
Jan 20 Python
浅谈keras保存模型中的save()和save_weights()区别
May 21 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 Python
python实现图片素描效果
Sep 26 Python
Python如何使用神经网络进行简单文本分类
Feb 25 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数组
2006/10/09 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
10款实用的PHP开源工具
2015/10/23 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
php上传excel表格并获取数据
2017/04/27 PHP
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
JavaScript多线程详解
2015/08/12 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
详细分析python3的reduce函数
2017/12/05 Python
python3实现磁盘空间监控
2018/06/21 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
详解python里的命名规范
2018/07/16 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
Django如何使用redis作为缓存
2020/05/21 Python
Python 内存管理机制全面分析
2021/01/16 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
英文翻译的自我评价语句
2013/10/04 职场文书
出售房屋委托书范本
2014/09/24 职场文书
校本培训个人总结
2015/02/28 职场文书
团委工作总结2015
2015/04/02 职场文书
送达通知书
2015/04/25 职场文书
专项资金申请报告
2015/05/15 职场文书
庆祝教师节主持词
2015/07/06 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
Java设计模式中的命令模式
2022/04/28 Java/Android