我正在从python控制台调试,并希望每次进行更改时重新加载模块,所以我不必退出控制台并重新输入它.我正在做:
>>> from project.model.user import *
>>> reload(user)
Run Code Online (Sandbox Code Playgroud)
但我收到:
>>>NameError: name 'user' is not defined
Run Code Online (Sandbox Code Playgroud)
重新加载整个用户类的正确方法是什么?有没有更好的方法来做到这一点,也许在调试时自动更新?
谢谢.
可能重复:
在Python中卸载模块
导入Numpy后,我想说要删除/删除numpy导入引用
import sys
import numpy as np
doMe()
np.something()
#unimport np
#remove numpy from memory
Run Code Online (Sandbox Code Playgroud) 我知道这可能听起来像一个非常愚蠢的问题,但无论如何.我在Python中创建了一个小脚本,我在shell中做了一些更改.通常,在OS X计算机上(它正在运行Python 2.7),我只需输入reload(the_module)并重新加载包含我所做更改的模块.但是,当我在这里重新加载模块时(在windows python v.3.4上),它只是给了我这个:
>>> reload(instfile)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
reload(instfile)
NameError: name 'reload' is not defined
Run Code Online (Sandbox Code Playgroud)
然后当我输入时imp.reload(my_module),它只是说该函数已被弃用.我似乎无法找到新功能(或它的等效物)将在任何地方,所以如果有人可以帮助我,这将是伟大的!:)
我正在使用Jupyter Notebook绘制饼图数字.
在我的代码的第一个单元格中,我有一个魔术命令%matplotlib inline,在这个魔术命令后我运行我的代码,一切正常,我的图形呈现.
但在第二个单元格中,当我设置%matplotlib notebook交互式绘图时,我的图形在运行第二个单元格后将无法呈现.
我需要重新启动内核并%matplotlib notebook再次运行单元格,并且%matplotlib inline在此之前无法运行命令.
这里是我的代码,第一个单元格用%matplotlib inline,这使得罚款:
import matplotlib.pyplot as plt
%matplotlib inline
labels = "No", "Yes"
sizes = [100, 50]
fig, ax = plt.subplots(figsize=(6, 6))
_, texts, autotexts = ax.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%',
shadow=False, startangle=90)
ax.axis('equal')
Run Code Online (Sandbox Code Playgroud)
之后,我有第二个单元格具有相同的代码,只是%matplotlib inline改为%matplotlib notebook.在运行此单元格后,图形将不会呈现,我需要重新启动内核并再次运行此单元格.
为什么?
以下代码允许您修改runtime.py运行时的内容.换句话说,您不必中断runner.py.
#runner.py
import time
import imp
def main():
while True:
mod = imp.load_source("runtime", "./runtime.py")
mod.function()
time.sleep(1)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
在运行时导入的模块是:
# runtime.py
def function():
print("I am version one of runtime.py")
Run Code Online (Sandbox Code Playgroud)
这种原始机制允许您"如何交换"Python代码(la Erlang).还有更好的选择吗?
请注意,这只是一个学术问题,因为我没有必要做这样的事情.但是,我有兴趣了解有关Python运行时的更多信息.
编辑:
我创建了以下解决方案:一个Engine对象提供了一个模块中包含的函数的接口(在这种情况下,模块被调用engine.py).该Engine对象还生成一个线程,用于监视源文件中的更改,如果检测到更改,则会调用notify()引擎上的方法,该方法会重新加载源文件.
在我的实现中,更改检测基于每秒frequency检查文件的SHA1校验和的轮询,但是其他实现也是可能的.
在此示例中,检测到的每个更改都会记录到已调用hotswap.log校验和的文件中.
用于检测改变的其他机制可以是服务器或使用inotify中的Monitor线程.
import imp
import time
import hashlib
import threading
import logging
logger = logging.getLogger("")
class MonitorThread(threading.Thread):
def __init__(self, engine, frequency=1): …Run Code Online (Sandbox Code Playgroud) 导入标准的"日志记录"模块会使用一堆虚拟条目污染sys.modules:
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32
>>> import sys
>>> import logging
>>> sorted(x for x in sys.modules.keys() if 'log' in x)
['logging', 'logging.atexit', 'logging.cStringIO', 'logging.codecs',
'logging.os', 'logging.string', 'logging.sys', 'logging.thread',
'logging.threading', 'logging.time', 'logging.traceback', 'logging.types']
# and perhaps even more surprising:
>>> import traceback
>>> traceback is sys.modules['logging.traceback']
False
>>> sys.modules['logging.traceback'] is None
True
Run Code Online (Sandbox Code Playgroud)
因此,导入此包会将额外的名称添加到sys.modules中,除了它们不是模块,只是对None的引用.其他模块(例如xml.dom和编码)也有这个问题.为什么?
我作为开发人员正在开发一个 python 包。该包存储在 git repo 中,我使用本地分支来调试/修复该包的功能。
为了测试我对代码所做的更正,我在编辑模式下使用 pip 使用 Jupyter 笔记本,以便将我的本地分支作为包加载,然后我测试我修改的功能。
我运行的步骤如下:
像这样例如:
! pip install -e Path/To/Local/Package/ # step 1
import local_foo as foo # step 2
foo.print() # step 3
Run Code Online (Sandbox Code Playgroud)
在第 3 步之后,如果代码没有按预期运行,我会更正我的包,重新启动 jupyter 内核并重新运行前面的 3 个步骤,直到获得我想要的行为。
我的问题是:
有没有办法避免重新启动内核?
我尝试了以下但在这种情况下不起作用:
IPython autoreload:
%load_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)
和importlib.reload:
import importlib
importlib.reload(foo)
Run Code Online (Sandbox Code Playgroud)
我尝试的解决方案来自这篇文章:https :
//support.enthought.com/hc/en-us/articles/204469240-Jupyter-IPython-After-editing-a-module-changes-are-not-effective-without-内核重启
非常感谢!
PS:另外,如果你们中的一些人可以分享使用 Jupyter notebooks 管理 python 包开发的技巧、工作流程或经验(测试,...)
在路径设置中,我错误地编写了代码:os.chdir ='\ some path',它将函数os.chdir()转换为字符串.有没有快速的方法来恢复功能而无需重新启动软件?谢谢!
我正在玩Flask,我无法弄清楚调试机制是如何工作的.更准确地说,当我使用我的应用程序保存python文件时,我不需要重新启动服务器,它会在我发出请求时自动加载.所以我的问题是正在运行的程序如何知道它已被更改并响应这些更改?
我正在尝试制作一个应用程序,学生可以在其中编写与特定问题相关的代码(比如检查数字是否为偶数)然后应用程序通过比较用户代码给出的输出与由应用程序中已经存在的正确代码给出的正确输出。
您可以在其中编写 python 脚本的应用程序(在 tkinter 文本框中)。文本框的内容首先存储在一个test_it.py
文件中。然后该文件由应用程序导入(单击按钮)。test_it.py然后调用中存在的函数以获取代码的输出(由用户)。
由于我正在“导入” 的内容test_it.py,因此,在应用程序运行时,用户只能测试他的脚本一次。原因是python只会导入test_it.py
文件一次。因此,即使将用户的新脚本保存在 test_it.py 中,它也不会对应用程序可用。
test_it.py每次单击测试脚本的按钮时重新加载。
虽然当我从脚本运行应用程序时这完美地工作,但此方法无法用于文件的已编译/可执行版本(.exe)(这是预期的,因为在编译期间所有导入的模块也将被编译,因此修改它们以后就不行了)
test_it.py即使在编译应用程序后,我也希望重新加载我的文件。
如果您想查看应用程序的工作版本以自行测试。你会在这里找到它。
python ×10
python-3.x ×3
dynamic ×1
flask ×1
hotswap ×1
import ×1
matplotlib ×1
module ×1
pip ×1
python-3.4 ×1
reload ×1