浅谈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 的 with 语句详解
Jun 13 Python
Python实现建立SSH连接的方法
Jun 03 Python
Python实现合并字典的方法
Jul 07 Python
Python实现大文件排序的方法
Jul 10 Python
详解Python多线程
Nov 14 Python
python正则实现提取电话功能
Feb 24 Python
python使用生成器实现可迭代对象
Mar 20 Python
python爬取网页内容转换为PDF文件
Jul 28 Python
python解析含有重复key的json方法
Jan 22 Python
Django获取应用下的所有models的例子
Aug 30 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 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连接access数据库
2008/03/27 PHP
深入apache host的配置详解
2013/06/09 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
精解window.setTimeout()&window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
js 目录列举函数
2008/11/06 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
浅谈python jieba分词模块的基本用法
2017/11/09 Python
Python 类的特殊成员解析
2018/06/20 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
python调用c++传递数组的实例
2019/02/13 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
市场安全管理制度
2014/01/26 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS