reload的模块必须是已经import过的模块,使用from XX import的不可以使用reload重新导入。
插曲
另外,使用的时候报出警告(后来发现这个错误是import的库的脚本中出现了
import imp
才报错的,其实不用理睬):
DeprecationWarning: the imp module is deprecated in favour of importlib; see the module’s documentation for alternative uses
import imp, sys, os
似乎没有很好的答案:
问题
是一个简单的提示,Stack Overflow也有类似的问题,
这里
,似乎是pycharm的一个bug。。。查看pycharm的
bug
由于reload没有解决我的问题,所以还是要另寻它法,参考
知乎回答
简单介绍一下这个sys.modules
sys.modules是一个全局字典,该字典是python启动后就加载在内存中。
每当程序员导入新的模块,sys.modules都将记录这些模块。
字典sys.modules对于加载模块起到了缓冲的作用。
当某个模块第一次导入,字典sys.modules将自动记录该模块。
当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。
字典sys.modules具有字典所拥有的一切方法,可以通过这些方法了解当前的环境加载了哪些模块
但是我实际测试下来情况和这个不太一样,
当前环境
,
import sys
sys.modules["os"]
Out[6]: <module 'os' from 'C:\\software\\anaconda\\lib\\os.py'>
> sys.modules["PaddleOCR"]
Traceback (most recent call last):
File "C:\software\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3331, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-7-fe1fefe7f529>", line 1, in <module>
sys.modules["PaddleOCR"]
KeyError: 'PaddleOCR'
> sys.modules["paddleocr"]
Traceback (most recent call last):
File "C:\software\anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3331, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-8-8235e520a40a>", line 1, in <module>
sys.modules["paddleocr"]
KeyError: 'paddleocr'
另外,参考Python模块导入之sys.modules,再进行测试,效果差不多,可以看到第一次导入的时候就导入了大部分,之后再进行导入就沿用之前的内容。
import sys
modules1 = sys.modules.copy()
import paddleocr
modules2 = sys.modules.copy()
print('首次导入paddleocr模块后在sys.modules中加入的模块名:', modules2.keys() - modules1.keys())
> 'paddle.optimizer.rmsprop',
'paddle.fluid.layers.loss',
'paddle.distributed.fleet.meta_parallel.parallel_layers.mp_layers',
'__mp_main__',
'paddle.optimizer.lamb',
'cffi.model',
len(modules2.keys() - modules1.keys())
Out[15]: 1737
import paddleocr
modules3 = sys.modules
print('再次导入paddle模块后在sys.modules中加入的模块名:', modules3.keys() - modules2.keys())
> set()
for i in (modules2.keys()-modules1.keys()):
if "paddleocr" in i:
print(i)
> paddleocr
paddleocr.tools
paddleocr.tools.infer.utility
paddleocr.paddleocr
paddleocr.tools.infer
主要参考菜鸟教程关于模块的部分
当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。
搜索路径
是一个解释器会先进行搜索的所有目录的列表
。
搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。
很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。
搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量
以我本机为例:
Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] on win32
import sys
sys.path
Out[3]:
['C:\\software\\PyCharm Community Edition 2020.3.2\\plugins\\python-ce\\helpers\\pydev',
'C:\\software\\PyCharm Community Edition 2020.3.2\\plugins\\python-ce\\helpers\\third_party\\thriftpy',
'C:\\software\\PyCharm Community Edition 2020.3.2\\plugins\\python-ce\\helpers\\pydev',
'C:\\software\\anaconda\\python37.zip',
'C:\\software\\anaconda\\DLLs',
'C:\\software\\anaconda\\lib',
'C:\\software\\anaconda',
'C:\\software\\anaconda\\lib\\site-packages',
'C:\\software\\anaconda\\lib\\site-packages\\win32',
'C:\\software\\anaconda\\lib\\site-packages\\win32\\lib',
'C:\\software\\anaconda\\lib\\site-packages\\Pythonwin',
'C:\\software\\anaconda\\lib\\site-packages\\IPython\\extensions',
'C:\\shaiic_work\\ZhiNengKeJiOCR',
'C:/shaiic_work/ZhiNengKeJiOCR']
如果是通常的命令行直接打印,则
>>> import sys >>> sys.path ['', 'C:\\software\\anaconda\\python37.zip', 'C:\\software\\anaconda\\DLLs', 'C:\\software\\anaconda\\lib', 'C:\\software\\anaconda', 'C:\\software\\anaconda\\lib\\site-packages', 'C:\\software\\anaconda\\lib\\site-packages\\win32', 'C:\\software\\anaconda\\lib\\site-packages\\win32\\lib', 'C:\\software\\anaconda\\lib\\site-packages\\Pythonwin']
sys.path 输出是一个列表,其中第一项是空串’',代表当前目录(若是从一个脚本中打印出来的话,可以更清楚地看出是哪个目录),亦即我们执行python解释器的目录(对于脚本的话就是运行的脚本所在的目录)。
因此若像我一样在当前目录下存在与要引入模块同名的文件,就会把要引入的模块屏蔽掉。
了解了搜索路径的概念,就可以在脚本中修改sys.path来引入一些不在搜索路径中的模块。
import paddleocrfrom importlib import reloadreload(paddleocr)reload的模块必须是已经import过的模块,使用from XX import的不可以使用reload重新导入。参考:python reload() 重载,重新加载模块Python3的reload重载技巧...
本文研究的主要是Python之reload流程的相关内容,具体如下。
在Python中,reload() 用于重新载入之前载入的模块。
reload() 函数语法:
reload(module)
Python中 import 只执行一次,后续的 import 仅仅在 sys.modules 中查找是否存在对应的模块对象,而对于源文件进行修改后想要立即重新导入该文件而不想整体重新执行程序时, reload 就在该处派上用途了。在实际中,测试代码修改结果,或者对于不能停止的服务需要动态改变运行行为 reload 是非常有用的。
reload 的执行流程如下所示:
1)在 sys.module
本文主要给大家介绍了关于python中reload(module)用法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
1、Python2中可以和Python3中关于reload()用法的区别。
Python2 中可以直接使用reload(module)重载模块。
Pyhton3中需要使用如下方式:
>>> from imp
>>> imp.reload(module)
>>> from imp import reload
>>> reload(module)
2、Python3中使用import和reload()出现错误的原因
from imp import reload
selfModule = sys.modules['__main__'] #获取自身模块当reload(X)时,只会重载X模块,X模块导入其他模块并不会重新导入,只会获取其他模块对象;因此想要reload全部模块的话 ,需要使用到模块对象的__dict__ , type() 函数:import types
from imp import reload
在 Python 编程中,为了便于维护,通常会把程序拆分为若干个模块(Module),在主程序中导入(import)这些模块。
模块中的内容可以是函数和类的定义,也可以是参数值的声明。
模块中的语句会且只会在第一次 import 该模块的时候被执行一次。
在实际项目中,有时会遇到这种情形:程序需要持续保持运行,而我们希望在不中断程序的前提下修改一个参数...
Python语言reload()函数重新载入模块
SoHo 2019.04.02
对于一个大型脚本语言而言,通常需要将其功能细化。将实现不同功能的代码写在不同的脚本中,这样方便在其他脚本需要使用此功能时可以以模块的形式导入。极大地方便了脚本的维护和重用。
导入模块的方法
浅析重新载入模块之前先简单了解一下python导入模块的机制。
导入模块或模块中的函数通常有三种方法:
1. import 模块...
将paddlepaddle 的版本从 2.2.0 降低到2.1.3 就行了。注意要运行两个命令:
python tools/export_model.py -c configs/det/det_r50_vd_sast_totaltext.yml -o Global.checkpoints="./models/sast_r50_vd_total_text/best_accuracy" Global.save_inference_dir="./inference/det_sast_tt"
python3 .
reload()函数将以前导入过的模块再加载一次。重新加载(reload)包括最初导入模块时应用的分析过程和初始化过程。这样就允许在不退出解释器的情况下重新加载已更改的Python模块。
若干注意事项:
1. 如果模块在语法上是正确的,但在初始化过程中失败,则导入过程不能正确地将模块的名字绑定到符号表中。这时,必须在模块能被重新加载之前使用import()函数加载该模块。
2. 重新加载
pycharm出现报错:DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
import imp, sys, os
在 Python 中,`reload` 函数用于重新加载之前已经导入的模块。它的作用是在运行时更新模块的代码,以便在修改后能够立即生效。
请注意,从 Python3.4 开始,`reload` 函数已经被移动到 `imp` 模块中,并且在 Python3.6 中被标记为废弃。替代的方法是使用 `importlib` 模块中的 `reload` 函数。
以下是一个示例,展示如何使用 `reload` 函数重新加载模块:
```pythonimport my_module# 对 my_module 进行修改# 使用 reload 函数重新加载 my_moduleimport importlibimportlib.reload(my_module)
需要注意的是,`reload` 函数只会重新加载已经导入的模块,如果之前没有导入过模块,`reload` 函数将会引发 `ImportError`。另外,重新加载模块不会影响已经从模块导入的对象的引用,因此需要手动更新这些引用。
希望这个解答能对你有帮助!如果你还有其他问题,请随时提问。