import 模块导入
★ 方式一:from xx import yy
-
导入方式
from info import redis_store
-
使用说明
【理解】: 相当于在本地定义一个变量redis_store 指向info模块中redis_store的值,对本地的redis_stone直接进行赋值,只会修改本地变量redis_store的指向,并不会修改info模块中redis_store的值;这里如果info模块中redis_store是可变类型数据(如list()),在本地中通过from info import redis_store导入后直接对其指向的值进行修改(如redis_store.append()),才会修改info模块中redis_store的值
★ 方式二:import xx
-
导入方式
import info info.redis_store
-
使用说明
【理解】: 使用 import info,相当于在本地定义一个变量info 指向模块info,但是它保持着自已的名字空间,这就是为什么你需要使用模块名来访问它的函数或属性: module.function 的原因 说明 导包或者导入包内变量,python解释器会将整个文件运行一次
★ 方式三:__import__("xx")
-
导入方式
__import__("xx")
-
使用说明
【理解】:返回模块名叫info的模块(模块也是对象)
★ 方式四:import_module(module_path)
-
文件结构
imp │───demo.py │ └───apps └───api └───urls.py
-
代码实例
-
urls.py
urlpatterns = [] app_name = "api"
-
demo.py
# 1. 基础导入模式 from apps.api import urls print(urls.urlpatterns, urls.app_name) # 2. 字符串导入模式 import importlib module_path = 'apps.api.urls' module = importlib.import_module(module_path) print(module.urlpatterns, module.app_name) """ 执行结果: [] api [] api """
-
★ reload 重复导入
-
背景说明
模块被导入后,"import module/from xx import yy" 不能重新导入模块,重新导入需要使用"reload", 也就是说如果对被导入的包中数据进行修改,即便使用import重新导入,正在运行的代码使用的仍然是原来包中的数据。(导包实际上是将硬盘中的数据加载到内存,reload 可以将修改的包数据重新加载到内存中)
-
代码实例
-
test.py
a = 10
-
main1.py
import test import time while True: time.sleep(1) import test print(test.a) """ 修改test.py 文件中变量a 的值并保存 <程序执行结果>: 10 10 10 10 """
-
main2.py
import importlib import test import time while True: time.sleep(1) # 重新导入test importlib.reload(test) print(test.a) """ 修改test.py 文件中变量a 的值并保存 <程序执行结果>: 10 10 10 10 100 100 2000 """
-
★ pyc文件作用说明
在这个过程中这些字节码都是在内存中的,众所周知Python的运行性能不如编译性语言(比如C语言,JAVA …),所以Python在程序执行结束后会把字节码写入到硬盘中,保存为.pyc文件,目的是下一次再执行 `python xxx.py`程序时,Python会先在目录下找`xxx.pyc`文件来执行,因为.pyc文件里保存的是字节码,所以就节省了Python解析器把`xxx.py`翻译成字节码的时间,所以就提高了性能。
- 详细参考 什么是pyc文件