我有一个主文件,它从另一个文件导入一个类,如下所示:
from pybrain.rl.environments.HoldemTask import HoldemTask. 当我更改HoldemTask.py时,更改不会反映在主文件中。我发现的唯一解决办法是运行Pybrain的
python setup.py install我可以重新加载模块或其他什么吗?Reload()似乎不起作用。
发布于 2016-04-07 17:00:48
首先:python setup.py install通常会复制它正在安装的代码,所以如果您发现需要在更改生效之前运行它,那么对于开发,您可能需要调整您的PYTHONPATH或sys.path,以便您的相关导入直接来自源代码树,而不是来自Python站点包库。您可以通过在运行主文件时将以下代码放在主文件的顶部来快速检查您的代码正在导入哪个文件:
from pybrain.rl.environments import HoldemTask # module object, not class
print(HoldemTask.__file__)其次,通常情况下,在进行代码更改以确保更改生效时重新启动Python进程要好得多。如果您确实需要在不重新启动的情况下显示更改,请继续阅读。
在Python中重新加载模块只会影响将来的导入。要使重新加载在进程中工作,您必须在重新加载之后替换导入的类对象。例如,在执行您列出的导入(在类方法或函数内)的“主文件”上下文中:
# we need a module object to reload(), not the class inside it
from import pybrain.rl.environments import HoldemTask as HoldemTask_module
reload(HoldemTask_module)
# we then need to replace the old class object with the reloaded one
# in the main file's module-wide (aka "global") namespace
global HoldemTask
HoldemTask = HoldemTask_module.HoldemTask这里的最后一个警告是,任何现有的HoldemTask对象都将继续使用旧代码,因为它们在自身中嵌入了对预重载类对象的引用。完成进程内重新加载的唯一方法是,如果代码是专门编写的,以便丢弃它基于原始模块创建的任何东西的每个实例。
https://stackoverflow.com/questions/36469804
复制相似问题