模块与包,模块与包的导入问题
一 模块与包:
1. 模块:一个py文件,被别的py文件导入使用,这个py文件称之为模块;
右键运行,运行的这个py文件称之为脚本文件
s1.py:
def add(a, b):
return a + b
s2.py:
import s1
print(s1.add(3,4)) # 7
s1自己点右键运行,这个文件s1叫脚本文件
在s2中,把s1,引入使用,s1就叫模块
2. 包:一个文件夹下必须有__init__.py
- init.py作用:包内部的函数,类..想给外部方便使用(导入的时候路径短一些),就要在里面做注册
# s2想用rachel包下s3里面的test,和zz里面的test1
# from rachel.s3 import test 之前需要这样导入
# 在包内部的init里面注册
__init__.py:
from .s3 import test
from .x.y.zz import test1
# 注册之后就可以直接导包
s2.py:
from rachel import test,test1
test() # test()
test1() # test1()
二 模块与包的导入问题
相对导入:相对于当前文件,如果右键运行该文件,就不能用相对导入
绝对导入:从环境变量开始导起
1. 需求:直接import rachel下的s3
s2.py:
import s3
s3.test() # 这样直接导会报错,找不到s3,找不到的原因是s3所在的路径不在环境变量中
2. 打印环境变量
# 打印出环境变量
import sys
print(sys.path)
结论:可以直接导模块的所有环境变量路径下的包或模块
# 可以直接导os的原因:os 所在的路径在环境变量中 'D:\\python\\python310.zip' 内置模块,包的位置 内置模块在解释器包中
import os
# 可以直接导django的原因:django所在的路径在环境变量中 'D:\\python\\lib\\site-packages' 第三方模块,包的位置,都是绝对导入
form 它自己的包名 import xx
3.将rachel包所在的路径加入到环境变量中,就可以直接导s3
只要把rachel所在路径,加入到环境变量即可,sys.path的结果是列表,
因此使用append 或者insert把rachel包所在的路径加入即可
s2.py:
import os
BASE_DIR = os.path.dirname(__file__)
rachel_path = os.path.join(BASE_DIR, 'rachel')
# rachel_path = os.path.join(r'D:\pycharm\drf4_dj', 'rachel')
sys.path.insert(0, rachel_path) # 也可以使用append
print(sys.path)
这时就可以直接导入s3
import s3
s3.test() # test
"""
这样就可以直接导了,但是python里面会飘红,但是这不代表是错误的,还是可以正常执行的
可以通过以下方法解决:
右击包,选Mark Directory as 再点击Sources Root即可
"""
rachel包已经加入到环境变量中:
4. 总结:
🍨导入模块有相对导入和绝对导入,绝对的路径是从环境变量开始的
🍨导入任何模块,如果使用绝对导入,都是从环境变量开始导入起
- import xx xx所在路径必须在环境变量
- from yy import yy所在路径必须在环境变量中
🍨脚本文件执行的路径,会自动加入环境变量
🍨相对导入的话,是从当前py文件开始计算的
🍨以脚本运行的文件,不能使用相对导入,只能用绝对导入
🍨pycharm 会把项目根路径加入到环境变量--->离开pycharm就不行了