Python 包的使用


什么是包

包就是把解决一类问题的模块放在同一个文件目录里,这个文件目录就叫做包
包是一种通过使用‘.模块名’来组织python模块名称空间的方式。

包的导入方法 – import

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
soft/                   

├── bin

│ ├── __init__.py

│ └── start.py

├── core

│ ├── __init__.py

│ └── Manage.py

│ └── login()

└── cook.py
  1. 最外层是soft软件工程目录
  2. bin 和 core 是两个包
  3. bin 下有着start.py 程序入口文件
  4. core 下有着Manage模块,里面带有一个login( )方法
  5. 整个目录还有一个cook.py文件 在soft目录下

1
2
3
4
5
6
7
8
9
10
# 想要在start.py 使用 Manage的login()方法
# 通过查看sys.path路径发现只能找到soft的bin目录,所以不能直接import core,需要从soft开始
import sys
print(sys.path) # D:\\PycharmProjects\\Notes\\soft\\bin

import soft.core.Manage
soft.core.Manage.login() # login in Manage

import soft.core.Manage as M
M.login() # login in Manage
  1. 关于包相关的导入语句也分为import和from … import …两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如,soft.core.Manage但都必须遵循这个原则。

  2. 对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

from … import …

1
2
3
4
5
6
7
8
9
import os
import sys

# 把soft目录加入到sys.path里去,然后就可以直接找到core
sys.path.append(os.path.dirname(os.getcwd()))
print(sys.path) # 'D:\\PycharmProjects\\Notes\\soft'

from core import Manage
Manage.login() # login in Manage
1
2
3
4
5
6
7
8
9
10
11
# 在core包下的文件引入其他包中的方法或者配置
# 记得由于我们执行开始是在start.py中执行,所以一定要在里面导入路径
# settings 文件中加入 DB_PATH = 'D:\PycharmProjects\Notes\soft\db'
# Manage
import os
from conf import settings
def login():
print('login in Manage')
file_name = os.path.join(settings.DB_PATH,'info.log')
with open(file_name,'w') as f:
f.write('Hello')

需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误
可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from… import …的绝对或者相对导入,且包的相对导入只能用from的形式。