python的包和模块,Python中的包
什么是模块? py文件是一个模块。
我们不会在开发过程中将所有代码都写在一个. py文件中。随着代码量的增加,函数或类可以存储在不同的。py文件按照它们的功能。
这样使得代码更便于后期管理和维护,也方便其他程序调用当前实现的函数~
在开发过程中,我们经常会参考其他模块,比如time、os、configparser、re等等。
Python中通常有三种类型的模块:
1)Python内置模块
2)第三方模块
3)自定义模块
模块的导入语句模块的导入语句如下:
导入模块1[,模块2[,moduleN]
或者
导入模块1
导入模块2
.
进口moduleN用哪种方式看个人习惯。导入模块后,可以通过模块名直接调用模块中的方法或类。方法()~
导入时间
Time.time() # time()是时间模块中的方法。
1545832129.4365451
导入日期时间
Datetime . datetime . now()# datetime是datetime模块中的类。
日期时间。DateTime (2018,12,26,21,49,2,805953)当我们使用import语句导入模块时,Python解释器会先在内置名称空间中查找,即判断导入的模块是否是内置模块(例如Time模块是Python内置模块),然后到sys.path列表中定义的路径中查找。py文件从前到后。
以下是个人笔记本上的sys.path输出列表:
#输出的pycharm:
[/Users/baby/PycharmProjects/untitled/module ,
/Users/baby/PycharmProjects/untitled ,
/usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 37 . zip ,
/usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 3.7 ,
/usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 3.7/lib-dyn load ,/usr/local/lib/python 3.7/site-packages ,
/Applications/py charm . app/Contents/helpers/py charm _ matplotlib _ back end ]
#终端输出:
sys.path
[ ,/usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 37 . zip ,
/usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 3.7 ,
/usr/local/Cellar/python/3 . 7 . 1/Frameworks/python . framework/Versions/3.7/lib/python 3.7/lib-dyn load ,
/usr/local/lib/python 3.7/site-packages ]可以看到pycharm中sys.path的输出与终端中略有不同。在pycharm中,pycharm会自动将当前项目的路径添加到sys.path列表的前面。所以如果当前路径中存在与要导入的模块同名的文件,要导入的模块就会被屏蔽~
sys.path列表中某个路径下的文件如下:~ ls/usr/local/cellar/python/3 . 7 . 1/frameworks/versions/3.7/lib/python 3.7
LICENSE.txt文件输入. py回复
__未来_ _。py fnmatch.py reprlib.py
_ _ phello _ _ . foo . py formatter . py rl completer . py
.
.
导入的过程现在我自己编辑了一个模块sftp,内容如下:
server_ip=192.168.0.30
def获取文件():
打印(下载文件.)然后导入到main.py文件中(路径与sftp.py相同):
导入sftp
导入sftp时,Python解释器会先创建一个新的命名空间,用来存储SFTP模块中定义的名称,然后在这个命名空间中执行sftp.py文件。
例如,现在在sftp模块中添加一条打印语句,然后执行main.py文件:
# sftp.py
server_ip=192.168.0.30
def获取文件():
打印(下载文件.)
打印(你好…)
#主页. py
导入sftp
#执行main.py后,会有以下输出:
你好.import语句可以理解为定义一个变量,变量指向对应的命名空间。通过使用这个变量,可以引用命名空间中的方法和变量~
导入SFTP后,注意区分新创建的名称空间和当前名称空间。示例如下:
# sftp.py
server_ip=192.168.0.30
def获取文件():
打印(下载文件.)
#主页. py
导入sftp
server_ip=1.2.3.4
打印(服务器ip)
打印(sftp.server_ip)
#执行main.py后,会有以下输出:
1.2.3.4
192.168.0.30注意sftp.py中的server_ip和main.py文件中的server_ip位于不同的命名空间,所以同名不会冲突;当然,称呼的方式也不同。当前文件中的server_ip可以直接引用,sftp模块中的server_ip需要用模块名引用。变量名(sftp.server_ip)
还需要注意的是,如果一个模块在当前文件中多次导入,那么模块中的代码只会执行一次,不会执行多次。那是因为第一次导入,模块中的方法和变量已经加载到内存中,后续的导入就不会重复加载了~重命名模块为了方便,在导入模块的时候也可以重命名模块;如果当前文件中存在同名的方法或变量,也可以通过这种方式避免冲突~
将日期时间作为日期导入
import from import中date.datetime.now()的语法如下:
从modname导入name1 [,name2 [,namen]] import语句将创建一个新的名称空间,并将模块中的名称存储在该名称空间中,而 from modname import name1,name2 将name1和name2分别导入当前名称空间。由于是导入到当前命名空间,所以可以直接使用,不需要在前面加上模块名。
从日期时间导入日期时间
Print(datetime.now()) #不需要写成datetime.datetime.now()
如果from … import导致名称被强调,将使用后面定义的那个。
def foo():
及格
从演示导入foo
#此处引用foo函数,将使用演示模块中的foo函数。
#############
从演示导入foo
def foo():
及格
#此处引用了foo函数,将使用当前文件中foo函数的包。简单地说,Python中的包是一个目录。py文件存储,加上一个__init__.py,很多模块都是按目录组织的,用包来管理和分类模块。引入包后,还有一个好处就是同名的模块可以放在不同的包下,避免名字冲突~
例如,现在有三个包,ROOT、pk_1和pk_2:
m1的全称是:root . PK _ 1 . m1;m2的全称是:ROOT.pk_2.m2 ~
init.py文件的作用就是应该有一个__init__。每个包目录中的py文件。如果这个文件不存在,那么这个目录只是一个目录而不是一个包。__init__。py文件可以是空文件,也可以是Python代码。原则是保持__init__。py文件尽量简洁~
导入的语句如下:
导入包
#或者在包下引入一个模块。
无论是从包导入模块导入包还是从包导入模块都会执行包包下的__init__文件。
现在有以下目录结构:
ROOT
pk_1
__init__.巴拉圭
m1.py
pk_2
__init__.巴拉圭
m2.py
__init__.巴拉圭
_ _ init _ _。test.pypk_1和pk_2包中的py文件都是空的。根包下的test.py想要使用pk _ 1包下m1模块中的方法,可以使用下面的语句:
从pk_1导入m1
M1.fun_1() # fun_1()是M1模块中的一个方法,但是如果使用下面的语句,就会抛出异常:
从pk_1导入*
m1.fun_1()
#异常信息:
名称错误:未定义名称“m1”
##############################
导入主键_1
pk_1.m1.fun_1()
#异常信息:
错误:模块 pk_1 没有属性 m1 。此时,您可以在__init__中升级软件包。pk_1包中的py(升级包中的导入权限)。__init__的内容。PK _ 1包中的py文件如下:
从pk_1.m1导入fun_1然后在test.py文件中,可以通过包名直接引入方法:
# 1)
从pk_1导入fun_1 #或从pk_1导入*
fun_1()
# 2)
导入主键_1
pk_1.fun_1()
这就是__init__存在的意义。这个包中的py文件。您可以编写相关的导入语句或语句来增强__init__中的导入权限。py文件,让用户在不知道包内部结构的情况下,通过包名直接调用这个包中某个模块的方法~
还可以使用_ _ all _列出要在__init__中导入的模块。py文件包中,比如在__init__中添加__all__变量。pk_1包中的py文件:
__all__=[m2]然后在test.py文件中,可以使用from pk_2 import *将__all__变量中列出的模块导入一次:
从pk_2导入*
M2.fun_2()如果__init__。pk_2包的py文件改进了fun_2方法:
\_\_init\_\_。包# pk_2的py内容
从pk_2.m2导入fun_2,在test.py中导入*后可以直接使用这个方法:
从pk_2导入*
Fun_2()注意:在__init__中定义__all__变量时。py,import *将只导入__all__中列出的模块
包中的模块调用现在具有以下目录结构:
log
util
__init__.巴拉圭
a.py
b.py
__init__.巴拉圭
test.py在测试中介绍模块a:
从util导入a将b模块引入a模块:
在这种情况下,import将在执行测试文件时报告一个错误。Modulenotfounderror:没有名为“B”的模块表明找不到B模块。
这是因为在执行测试时,sys.path中的路径不包含util下的路径,所以在a.py文件中导入B模块时会报错(如果直接执行a.py文件就不会有问题)。将模块B引入模块A的正确方法是:
从util导入b当然,此时a.py文件已经不能单独运行,运行时会报错。
提示:使用a.py文件中的 from util import b 来导入模块b,如果此时直接执行a.py文件,会得到一个错误,因为a.py文件本身位于util路径下,sys.path中有一个util路径(执行a.py时为sys.path)。但是 from util 找不到util,只有当util位于sys.path的一个路径中时 from util 才能找到util ~
现在,如果主可执行文件本身位于项目目录下的一个包中,为了从其他包中引入模块,您需要在os.path中添加一个路径来实现这一点:
现在可执行文件在bin目录下是bin.py。在bin.py中,应该导入util包中的模块A和B。为了确保通用性,可以使用以下方法获取日志路径并将其添加到os.path中:
导入系统、操作系统
sys.path.insert(0,OS . path . dirname(OS . path . dirname(OS . path . ABS path(_ _ file _ _)))
from util import a _ _ name _ _ variable _ _ name _ _是像__file__一样的内置变量。这个变量记录了当前文件(使用__name__变量的文件)是作为模块运行还是作为主执行文件运行~
示例:
A.py文件内容
打印(__name__)
#直接执行a.py文件并输出:
# __main__
现在在b.py文件中导入一个。b . py文件的内容如下:
导入a
#现在运行b.py文件(这个过程将运行a.py文件)并输出内容:
# a ##是a的模块名。该函数通常用于代码调试:
if __name__==__main__ :
Pass可以在if语句中编写被调试的代码来调试当前py文件中的代码,因为__name__变量的值是__main__通过直接运行当前文件。外部模块调用时,不会执行if语句的内容,因为外部模块调用__name__变量的值就是模块名~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。