浅谈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代码的打包与发布详解
Jul 30 Python
简单谈谈python中的Queue与多进程
Aug 25 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
Django框架教程之正则表达式URL误区详解
Jan 28 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
python实现最大子序和(分治+动态规划)
Jul 05 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
ipad上运行python的方法步骤
Oct 12 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
套娃式文件夹如何通过Python批量处理
Aug 23 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获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
php跨服务器访问方法小结
2015/05/12 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
详解vue渲染函数render的使用
2017/12/12 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
Python常用模块用法分析
2014/09/08 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
幼儿教育感言
2014/02/05 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
法制宣传标语集锦
2014/06/25 职场文书
竞聘自述材料
2014/08/25 职场文书
2014年调度员工作总结
2014/11/19 职场文书
财务总监岗位职责
2015/02/03 职场文书
拖欠货款起诉状
2015/05/20 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
应收账款管理制度
2015/08/06 职场文书
诉讼和解协议书
2016/03/23 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP