有没有办法让IPython自动重新加载所有更改的代码?在每个行在shell中执行之前,或者在特别请求它时失败.我正在使用IPython和SciPy进行大量的探索性编程,每当我更改它时,必须手动重新加载每个模块是非常痛苦的.
有没有一种直接的方法来查找属于python包的所有模块?我发现这个旧的讨论并不是真正的结论,但在推出基于os.listdir()的自己的解决方案之前,我希望得到明确的答案.
我知道如何在常规Python解释器会话中重新加载常规Python模块.这个问题记录了如何做得很好:
出于某种原因,我在Django的"manage.py shell"解释器会话中遇到了麻烦.要重新创建我的问题,请启动此处的基本Django教程:
创建"民意调查"应用程序和"民意调查"类后,通过"manage.py shell"启动解释器并将"民意调查"应用程序导入其中.
import polls.models as pm
Run Code Online (Sandbox Code Playgroud)
创建一个新的"民意调查"对象:
p = pm.Poll()
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利.现在回到您的源代码并添加任意方法或属性.例如,我添加了:
def x(self):
return 2+2
Run Code Online (Sandbox Code Playgroud)
现在回到解释器并"重新加载"模块:
reload(pm)
Run Code Online (Sandbox Code Playgroud)
现在尝试使用您的新方法或属性:
p1 = pm.Poll()
p1.x()
Run Code Online (Sandbox Code Playgroud)
你会收到这条消息:
'Poll' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?我还尝试重新运行import命令,使用不同的语法导入模块,删除对任何"Poll"对象或"Poll"类的所有引用.我也尝试过使用IPython解释器和普通的Python(v2.6)解释器.似乎没什么用.
在常规解释器会话中使用与任意Python模块相同的技术可以很好地工作.我似乎无法让它在Django的"shell"会话中工作.
顺便说一句,如果它有任何区别,我在Ubuntu 9.04机器上这样做.
我正在使用IPython,并希望从另一个笔记本中运行功能(不需要在不同的笔记本之间剪切和粘贴).这可能并且相当容易吗?
在将函数导入ipython之后,当我在ipython之外修改它们时,如何重新加载它们?
使用Cython,我正在开发一个扩展模块,它将构建为.so文件.然后我使用IPython测试它.在开发过程中,我经常需要进行更改和重建.我还需要退出IPython shell并重新输入所有命令.重新导入模块
import imp
imp.reload(Extension)
Run Code Online (Sandbox Code Playgroud)
不起作用,代码不更新.有没有办法让我在重建模块后避免重启IPython shell?
我知道这可能听起来像一个非常愚蠢的问题,但无论如何.我在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),它只是说该函数已被弃用.我似乎无法找到新功能(或它的等效物)将在任何地方,所以如果有人可以帮助我,这将是伟大的!:)
我从主文件夹启动IPython /project.现在,如果我在文件中进行更改/project/tests/some_module.py,则无法在IPython中自动重载更改.另外,在保存更改并希望在提示符中运行其他脚本后,我收到以下消息:
[autoreload of some_module failed: Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/IPython/extensions/autoreload.py", line 229, in check
superreload(m, reload, self.old_objects)
ImportError: No module named some_module]
Run Code Online (Sandbox Code Playgroud)
它似乎检测到文件夹内的更改,/tests但无法导入它.有人可以帮我弄这个吗?
编辑:
为了更好地说明:我从主文件夹中的终端启动IPython.在这个文件夹中,我有另一个文件夹tests.里面tests我有两个python文件:
some_module.py:
def hello_world():
print "Hello World!!!"
Run Code Online (Sandbox Code Playgroud)
use_some_module.py:
from some_module import hello_world
hello_world()
Run Code Online (Sandbox Code Playgroud)
一旦我启动IPython,some_module.py中的进一步更改将不会在IPython中加载.例如,如果我print "Hello Earth!!!"在定义hello_world()和运行中添加第二个run tests/use_some_module.py,我会收到上面显示的错误消息,并且只会获得"Hello World!!!"打印.
Edit2:我想要一个解决方案,我不需要更改工作目录,也不需要手动添加任何搜索路径.我想让它自动加载自动加载.
Python 3.4.2的Python控制台
我在PyCharm Community Edition 4.5.4中的Python控制台中正确运行的模块中定义了一个函数:
ReloadTest.py:
def reloadtest(x):
print("Version A: {}".format(x))
Run Code Online (Sandbox Code Playgroud)
Python控制台:
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32
>>> from ReloadTest import reloadtest
>>> reloadtest(1)
Version A: 1
Run Code Online (Sandbox Code Playgroud)
在我将函数修改为"版本B"后,PyCharm无法找到更改,并importlib.reload(ReloadTest)给出了错误.
我每次修改模块时都必须重新加载Python控制台或重启PyCharm.我做错了什么?处理这个问题的最佳方法是什么?
ReloadTest.py:
def reloadtest(x):
print("Version B: {}".format(x))
Run Code Online (Sandbox Code Playgroud)
Python控制台:
>>> reloadtest(1)
Version A: 1
>>> from ReloadTest import reloadtest
>>> reloadtest(1)
Version A: 1
>>> import importlib
>>> importlib.reload(ReloadTest)
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: …Run Code Online (Sandbox Code Playgroud) 假设我有一个名为的python模块mymodule.在我的代码的顶部,我有这个:
import mymodule
reload(mymodule)
Run Code Online (Sandbox Code Playgroud)
我的目录结构在哪里
/dir/mymodule.py
Run Code Online (Sandbox Code Playgroud)
但是,我想mymodule.py分成几个文件,同时仍然被定义为单个模块(即我不想单独导入每个文件 - 我希望能够像以前一样使用我的导入/重新加载).
我知道如何做到这一点的唯一方法如下
/dir/mymodule/
file1.py
file2.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
哪里__init__.py包含
from file1 import *
from file2 import *
Run Code Online (Sandbox Code Playgroud)
这主要是有效的,但我的呼吁reload(mymodule)不再做任何事情,因为它不会重新加载任何名为via*imports的东西.
有什么建议?
我加载在Python(2.7.10)与子模块from app import sub,其中sub有一个config变量。因此,我可以运行print sub.config并查看一堆配置变量。不是超级复杂。
如果我在脚本中更改了配置变量,则必须有一种方法可以重新加载模块并查看更改。我发现了一些说明可以使用的指令reload(app.sub),但出现错误:
NameError: name 'app' is not defined
Run Code Online (Sandbox Code Playgroud)
如果我这样做reload(sub),错误是:
TypeError: reload() argument must be module
Run Code Online (Sandbox Code Playgroud)
如果可以,import app我可以使用查看配置print app.sub.config并重新加载reload(app)
-如果我这样做import app然后跑步
我找到了自动重新加载的说明: 在IPython中重新加载子模块
但是没有办法手动重新加载子模块吗?
在文件中mylibrary.py我有这个功能
def myfunc(a,b):
return a+b
Run Code Online (Sandbox Code Playgroud)
在 Jupyter 笔记本中我运行
import mylibrary
mylibrary.myfunc(1,2)
Run Code Online (Sandbox Code Playgroud)
并且输出3符合预期。
但是,当我更新文件mylibrary.py以使其内容为
def myfunc(a):
return a+1
Run Code Online (Sandbox Code Playgroud)
并在 Jupyter 中运行
import mylibrary
mylibrary.myfunc(1,2)
Run Code Online (Sandbox Code Playgroud)
输出是一个错误:
TypeError: myfunc() missing 1 required positional argument: 'b'
Run Code Online (Sandbox Code Playgroud)
显然 Jupyter 仍在使用旧版本的mylibrary.py. mylibrary.py如果我在尝试导入缓存后删除为其创建的缓存,该错误仍然存在。
为什么会发生这种情况,我该如何纠正?(一个明显的解决方法是在 Jupyter 笔记本中定义myfunc,而不是将其分开,现在我会这样做。但是,这解决了问题而不是实际修复它,所以我仍然不明白出了什么问题,并且结果我以后可能会陷入陷阱。因此,我认为找出问题所在是值得的。)
我有以下代码行:
from pip import main as pipmain
# initial installation
pipmain(["install", "pyscenic==0.10.0"])
import pyscenic
pyscenic.__version__
# return 0.10.0
# Some large code here
# second installation
pipmain(["install", "install", "pyscenic==0.10.4"])
import pyscenic
pyscenic.__version__
# still return 0.10.0
# Another large chunk that required new version
Run Code Online (Sandbox Code Playgroud)
我想在我的代码中动态升级pyscenic包。然而,正如我上面指出的,在第二次安装中版本仍然没有改变。我预计它会更改为 0.10.4。我怎样才能正确地做到这一点?
我也尝试过这个,仍然没有效果:
import os
import importlib
os.system('pip install pyscenic==0.10.0')
import pyscenic
pyscenic.__version__
os.system('pip install pyscenic==0.10.4')
import pyscenic
pyscenic.__version__
importlib.reload(pyscenic)
pyscenic.__version__
Run Code Online (Sandbox Code Playgroud)
所有代码都在 IPython(交互式)上进行了测试。如果我退出IPython并再次重新输入它就会生效。但这不是我想要的。
python ×12
ipython ×5
python-3.x ×2
cython ×1
django ×1
import ×1
jupyter-lab ×1
module ×1
packages ×1
pip ×1
pycharm ×1
python-2.7 ×1
python-3.4 ×1