程序导入其它模块和库,其实就是直接运行了对应的模块程序,或者对应的模块下的__init__.py
文件。
在项目文件下创建两个python文件
基本模块知识
- model_test.py
print("model test begin....")def modelTest():print("this is model test")# 模块运行有两种方式
# 1.直接运行 -- __main__
# 2.导入运行 -- 模块的绝对路径print(f"__name__ is {__name__}")
# __name__可以区分是直接运行还是导入运行
# 如果是直接运行那么它会输出 __name__ is __main__
# 如果是导入运行那么它会输出 __name__ is model_test# 所以在库模块中要测试模块功能,可以使用下面这种方式测试,而不会影响到导入此模块的程序
if __name__ == "__main__":modelTest()print("model test 直接运行")
直接运行model_test.py,它会输出 __name__ is __main__
- import_code.py
import model_test
from model_test import modelTest
# 模块运行有两种方式
#1.直接运行 __main__
#2.导入运行 模块的绝对路径model_test.modelTest()
modelTest()
运行import_code.py,导入运行了model_test,它会输出 __name__ is model_test
if __name__ == "__main__":
语句块下的命令,不会被导入运行!所以print("model test 直接运行")
没有执行!而其他print都被执行了。
创建Python Package目录
在pycharm中创建python package目录,它会默认创建一个__init__.py
文件而对应的目录会被标记为一个python package
目录,或者我们手动创建一个普通目录,再手动创建__init__.py
文件也是同样的效果。
我们创建如下目录结构:
__init__.py
文件写入
# 包的初始化文件
# 导入包的时候会先执行这个文件
print("this is __init__.py")
a.py
文件写入
print("this is a.py")
在01模块和包.py
中写入
from pythonpack import a
运行结果
首先执行了__init__.py
里面的代码,其次才执行了a.py
创建一个flask程序测试模块效果
创建如下项目格式
app.py
文件写入如下内容
from flask import Flask
def create_app():app = Flask(__name__)# 做app的配置return app
config/setings.py
文件写入如下内容
Host="0.0.0.0"
Port=9000
main.py
文件写入如下内容
from app import create_app
from config import setings
# 直接调用create_app()初始化app
app = create_app()@app.route("/")
def index():return "this is index"@app.route("/teacher")
def teacher():return "this is teacher"@app.route("/student")
def student():return "this is student"#使用setings.py中的配置
app.run(host=setings.Host, port=setings.Port, debug=True)
用这种导入调用的方式,将对应的配置放到对应的模块下,更加有利于项目的管理。
相对导入和绝对导入
在我们进行相对和绝对导入的时候需要,时刻关注top-level
的位置 --》 程序入口
,目录结构如下:
pack1.pack1model
# 这种方式导入叫做绝对导入
# from pythonpack.pack2 import pack2model# 相对导入
from ..pack2 import pack2model# 相对导入,不能访问到top-level那一层,只能访问到top-level以下层,下面这种会报错
#from ...pythonpack.pack2 import pack2modeldef pack1test():print("this is pack1test")pack2model.pack2test()
pack2.pack2model
def pack2test():print("this is pack2test")
程序入口.py
# 可以导入到函数,也可以导入到模块
#from pythonpack.pack1.pack1model import pack1test
#pack1test()from pythonpack.pack1 import pack1model# 绝对导入 相对导入
# 时刻关注top-level的位置 --》 程序入口
pack1model.pack1test()
top-level
-> sys.path
那么既然只能导入top-level
下的模块,那么python中的那么多模块,都是怎么找到的呢?
其实可以使用sys.path
查看当前所有的top-level目录,而其中就包含当前的目录
,而且返回一个list
格式,我们可以自己定义一些路径加入到top-level中!使用sys.path.append()
,这样一来就可以直接导入其它目录下的模块了!
import sys
print(sys.path) #返回一个列表格式
sys.path.append("绝对路径") #将其它路径也加入到top-level
模块的查找
1.先看内存里,是否导入过,如果导入过,就不会去找了,直接从内存拷贝。
2.如果内存里面没有,就去sys.path定义的路径顺序,一个一个去查找。