模块与包,模块与包的导入问题

一 模块与包:

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就不行了

posted @ 2023-09-01 17:32  瓜瓜不甜  阅读(9)  评论(0编辑  收藏  举报