我经常在Python解释器中测试我的模块,当我看到错误时,我会快速更新.py文件。但是我如何让它反映在解释器上呢?所以,到目前为止,我一直在退出并重新进入解释器,因为重新导入文件再次不适合我。


当前回答

蜻蜓的回答对我有用(python 3.4.3)。

import sys
del sys.modules['module_name']

下面是一个较低层次的解决方案:

exec(open("MyClass.py").read(), globals())

其他回答

Python3的更新:(引用自已经回答的答案,因为这里的最后一个编辑/注释建议使用一个已弃用的方法)

在python3中,reload被移动到imp模块。在3.4中,弃用了imp,改用了importlib,并在后者中添加了reload。当目标为3或更高版本时,在调用reload或import时引用适当的模块。

导读:

Python3 >= 3.4: importlib.reload(packagename) Python3 < 3.4: imp.reload(packagename) Python2:继续


使用重载内置函数:

https://docs.python.org/2/library/functions.html#reload

When reload(module) is executed: Python modules’ code is recompiled and the module-level code reexecuted, defining a new set of objects which are bound to names in the module’s dictionary. The init function of extension modules is not called a second time. As with all other objects in Python the old objects are only reclaimed after their reference counts drop to zero. The names in the module namespace are updated to point to any new or changed objects. Other references to the old objects (such as names external to the module) are not rebound to refer to the new objects and must be updated in each namespace where they occur if that is desired.

例子:

# Make a simple function that prints "version 1"
shell1$ echo 'def x(): print "version 1"' > mymodule.py

# Run the module
shell2$ python
>>> import mymodule
>>> mymodule.x()
version 1

# Change mymodule to print "version 2" (without exiting the python REPL)
shell2$ echo 'def x(): print "version 2"' > mymodule.py

# Back in that same python session
>>> reload(mymodule)
<module 'mymodule' from 'mymodule.pyc'>
>>> mymodule.x()
version 2

简短的回答:

尝试使用reimport:一个完整的Python重载。

再答:

看起来这个问题是在reimport发布之前被问到/回答的,reimport自称是“Python的全功能重载”:

This module intends to be a full featured replacement for Python's reload function. It is targeted towards making a reload that works for Python plugins and extensions used by longer running applications. Reimport currently supports Python 2.4 through 2.6. By its very nature, this is not a completely solvable problem. The goal of this module is to make the most common sorts of updates work well. It also allows individual modules and package to assist in the process. A more detailed description of what happens is on the overview page.

注意:虽然重新导入显式地支持Python 2.4到2.6,但我一直在2.7上尝试它,它似乎工作得很好。

不确定这是否完成了所有预期的事情,但你可以这样做:

>>> del mymodule
>>> import mymodule

无论你导入一个模块多少次,你都将从sys. exe中得到相同的模块副本。Modules -在第一次导入mymodule时加载

我很晚才回答这个问题,因为上面/之前的每个答案都有一点答案,所以我试图用一个简单的答案来总结。

使用内置函数:

对于Python 2。x -使用内置的重载(mymodule)函数。

对于Python 3。使用imp.reload(mymodule)。

对于Python 3.4 -在Python 3.4中,imp已弃用,转而支持importlib,即importlib.reload(mymodule)

一些注意事项:

It is generally not very useful to reload built-in or dynamically loaded modules. Reloading sys, __main__, builtins and other key modules is not recommended. In many cases extension modules are not designed to be initialized more than once, and may fail in arbitrary ways when reloaded. If a module imports objects from another module using from ... import ..., calling reload() for the other module does not redefine the objects imported from it — one way around this is to re-execute the from statement, another is to use import and qualified names (module.name) instead. If a module instantiates instances of a class, reloading the module that defines the class does not affect the method definitions of the instances — they continue to use the old class definition. The same is true for derived classes.


外部包:

reimport - reimport目前支持Python 2.4到2.7。

xreload-通过在scratch命名空间中执行模块,然后 适当地修补类、方法和函数。这就避免了 需要修补实例。将新对象复制到目标中 名称空间。

livecoding - Code reloading allows a running application to change its behaviour in response to changes in the Python scripts it uses. When the library detects a Python script has been modified, it reloads that script and replaces the objects it had previously made available for use with newly reloaded versions. As a tool, it allows a programmer to avoid interruption to their workflow and a corresponding loss of focus. It enables them to remain in a state of flow. Where previously they might have needed to restart the application in order to put changed code into effect, those changes can be applied immediately.

import sys
del sys.modules['module_name']