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

ruixue1225 / 2023-09-01 / 原文

一 模块与包:

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' 第三方模块,包的位置
import django

3.将rachel包所在的路径加入到环境变量中,就可以直接导s3

只要把rachel所在路径,加入到环境变量即可,sys.path的结果是列表,
因此使用append 或者insert把rachel包所在的路径加入即可
s2.py:
import os
rachel_path = os.path.join(r'D:\pycharm\drf4_dj', 'rachel')
sys.path.insert(0, rachel_path)
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文件开始计算的

  • 以脚本运行的文件,不能使用相对导入,只能用绝对导入