Python以优美而吸引我们的追逐!
为了能够更好的管理Python工程,使工程逻辑清晰,除了写出更加pythonic的代码(注:pythonic为Python语言规范,见官方:https://www.python.org/dev/peps/pep-0008/),还需要在工程之中建立起规范的包和模块。
python包和模块概念:
在python中,模块的本质就是Python源代码文件,包的本质就是一个文件夹,用以存放一系列python文件。每一个包下面都有一个__init__.py文件,其作用正是使得各个模块以及包之间能够相互“引用”。
python用关键字import用于导入需要的包或者模块。
通常一个工程包含的包和模块有以下相似的结构:
/Project
——/doc
——/src
————__init__.py
————/package1
——————__init__.py
——————module1.py
————/package2
——————__init__.py
——————module2.py
——————module3.py
——/run
————__init__.py
————main.py
——readme
——__init__.py
一般情况下,在上述工程中/run包下包含着可执行模块,能够把工程运行起来,/src下包含着工程需要的源代码,也是相关的包和模块,/doc为一些配置文件,readme为文本文件,用以介绍工程。
下面分为几种情况介绍import的使用。
(1)同目录(同包)下的模块import
在一个包下的不同模块的import,只要包中含有__init__.py文件,那么不同的模块间是可以相互导入的,以/package2包为例,从module2.py导入module3.py:
import module3——导入module3,可以通过module3.name引用module3中的变量、函数或者类
import module3 as m——为module3提供个本地的别名
from module3 import name——从module3中导入”name”
from module3 import *——不建议使用,从module3导入所有,这样的话会出现命名空间重叠的情况,根据个人情况选择使用。
(2)不同目录下的模块import
不同目录下的模块import就不可以直接导入了,在python中内置了模块搜索路径,其保存在一个列表中,可以通过下面代码查看:
import sys
print(sys.path)
python的import会从path列表中搜索路径,在不同的包下,路径是不包含的path中的,因此需要我们手动的在程序中加入需要搜索的包路径可以通过以下几步完成:
#file为module1.py
import sys,os
#查看当前文件绝对路径
print(os.path.abspath(__file__))#__file__为当前文件
#将两个包的公共目录赋给一个变量
Add_Path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
#将Add_Path添加到path中
sys.path.append(Add_Path)
#这个时候就可以导入了,
from package2 import module2
(3)导入包
记住一点:导入包就是运行包里的__init__.py文件!
在(2)中,我们也可以通过导入包来导入包里的模块,但是需要在__init__.py中另外再导入需要导入的模块,什么意思呢,例如现在我们要导入package2这个包,再利用这个包引用module2,这时候我们就需要在package2中的__init__.py文件中先导入module2,这样的话导入了包就会去运行__init__.py文件,就可以导入module2了
#package2中的__init__.py文件
from . import module2 #不可直接import module2
#从packa1中的module1导入package2并引用module2
import package2 #此时会加载package2中的__init__.py文件
package2.module2 #可以调用了
import的使用还需要在工程实践中慢慢体会和熟练!
推荐一python算法书:《Data Structures and Algorithms with Python》这两天看的很棒!