模块引入

 一、模块

分类:

  1、内置模块

  2、自定义模块

  3、第三方开源模块

 

二、导入基础之sys.path

  需要导入的包/模块的位置必须在sys.path中。在自定义模块中需要将路径加入sys.path。

1 import os
2 import sys
3 
4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 根据实际进行调整
5 sys.path.append(BASE_DIR)
sys.path添加方法

 

三、导入方法

 1 import os
 2 import sys as my_sys
 3 from collections import deque
 4 from collections import Counter as ct
 5 
 6 print(os.path.abspath(__file__))
 7 # D:\Python相关\python_project\test.py
 8 print(my_sys.path)
 9 # ['D:\\Python相关\\python_project', 'C:\\Python\\Python36\\python36.zip', 'C:\\Python\\Python36\\DLLs', 'C:\\Python\\Python36\\lib', 'C:\\Python\\Python36', 'C:\\Python\\Python36\\lib\\site-packages', 'C:\\Program Files\\JetBrains\\PyCharm 2017.3\\helpers\\pycharm_matplotlib_backend']
10 print(deque("abcdefg"))
11 # deque(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
12 print(ct("hellow world"))
13 # Counter({'l': 3, 'o': 2, 'w': 2, 'h': 1, 'e': 1, ' ': 1, 'r': 1, 'd': 1})
普通导入

(相对导入:待补充。)

1 my_os = __import__("os")
2 print(my_os.path)
3 # <module 'ntpath' from 'C:\\Python\\Python36\\lib\\ntpath.py'>
__import__导入
1 import importlib
2 
3 my_os = importlib.import_module("os")
4 print(my_os.path)
5 # <module 'ntpath' from 'C:\\Python\\Python36\\lib\\ntpath.py'>
importlib导入
 1 # ############# 文件1 ##############
 2 # 放入os.environ,仅在本系统有效。key:USER_SETTINGS,value:config.settings
 3 os.environ["USER_SETTINGS"] = "config.settings"
 4 
 5 
 6 
 7 # ############# 文件2 ##############
 8 # 使用
 9 settings_module = os.environ.get("USER_SETTINGS")
10 if not settings_module:
11     return
12 m = importlib.import_module((settings_module))
environ结合importlib

 

四、应用实例

1、例1

 1 import os
 2 import sys
 3 
 4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 根据实际目录调整BASE_DIR
 5 sys.path.append(BASE_DIR)
 6 # print(sys.path)
 7 # [...。, 'D:\\Python相关\\python_project\\模板\\template']  # 已加入sys.path
 8 
 9 from conf import settings
10 from core.a.b import test
11 print(settings.name)
12 # i am settings.py
13 print(test.name)
14 # i am core.a.b.test.py
run.py
1 name = "i am settings.py"
settings.py
name = "i am core.a.b.test.py"
test.py

 

2、例2

 

 1 import os
 2 import sys
 3 
 4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 5 sys.path.append(BASE_DIR)
 6 
 7 os.environ["USER_SETTINGS"] = "config.settings"  # 告诉系统,用户自定义的settings路径
 8 from lib.conf.config import settings  # 从自定义模块lib.conf.config导入变量settings
 9 
10 if __name__ == '__main__':
11     print(settings.NAME1)  # 根据settings上的定义顺序,用户自定义的变量NAME1覆盖了global_settings
12     print(settings.NAME2)  # NAME2没被覆盖,则生效
start.py
1 NAME1 = "user_define_settings"
settings
1 NAME1 = "global_settings"  # 被覆盖了
2 NAME2 = "global_settings_2"
global_settings
 1 from . import global_settings  # 导入global_settings
 2 import os
 3 import importlib
 4 
 5 
 6 class Settings(object):
 7     def __init__(self):
 8         # ############## 找到默认配置global_settings ##############
 9         for name in dir(global_settings):  # 遍历global_settings的变量
10             if name.isupper():  # 如果变量为大写,则是settings里定义的变量。global_settings的变量名约定俗成为大写。
11                 value = getattr(global_settings,name)
12                 setattr(self,name,value)  # 把key:name,value:value的赋给Settings
13 
14 
15         # ############## 找到自定义配置,比默认配置优先级高,因此放在下面,下面的会覆盖上面的 ##############
16         # 根据字符串导入模块
17         settings_module = os.environ.get("USER_SETTINGS")  # 在start.py已把用户自定义settings导入到environ变量,现结合importlib导入模块
18         if not settings_module:
19             return
20         m = importlib.import_module((settings_module))
21         for name in dir(m):  # 与上面的gloabl_settings类似
22             if name.isupper():
23                 value = getattr(m,name)
24                 setattr(self,name,value)
25 
26 
27 settings = Settings()  # 实例化
config

 

posted @ 2018-03-03 17:28  fat39  阅读(166)  评论(0)    收藏  举报