相关疑难解决方法(0)

更改类时Jupyter自动重新加载失败

在大多数情况下,使用jupyter实验室/笔记本时,我将这两行放在笔记本的第一个单元格中:

%reload_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)

这些通常使我可以修改导入的脚本并使用它们,而不必重新导入它们或重新启动内核。昨天,我遇到了一个问题:我修改了脚本,在笔记本上执行一个单元格给了我一个错误。重新启动内核并重做导入可修复它。我调查了此问题,并尝试创建一个最小的示例。

假设您有以下工作目录:

+-- nb.ipynb
+-- scripts
|   +-- __init__.py
|   +-- script1.py
Run Code Online (Sandbox Code Playgroud)

笔记本由三个单元组成:

%reload_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)

\

from scripts.script1 import Foo
Run Code Online (Sandbox Code Playgroud)

\

a = Foo(42)
Run Code Online (Sandbox Code Playgroud)

在实验开始时,script1包含以下内容:

class Foo():
    def __init__(self, x):
        self.x = x
Run Code Online (Sandbox Code Playgroud)

现在,我们执行笔记本的3个单元,一切正常。然后,我们转到script1.py并将其代码替换为:

class Bar():
    def __init__(self, x):
        self.x = x

class Foo(Bar):
    def __init__(self, x):
        super().__init__(x)
Run Code Online (Sandbox Code Playgroud)

我们保存文件,回到笔记本,然后执行包含单元格,a = Foo(42) 这将产生以下错误:

[autoreload of script.script failed: Traceback (most recent call last):
  File "/home/user/miniconda3/lib/python3.6/site-packages/IPython/extensions/autoreload.py", line 245, in check
    superreload(m, reload, self.old_objects)
  File "/home/user/miniconda3/lib/python3.6/site-packages/IPython/extensions/autoreload.py", …
Run Code Online (Sandbox Code Playgroud)

python jupyter-notebook

10
推荐指数
1
解决办法
540
查看次数

sys.modules和globals()中的模块名称

如果我导入模块,模块名称将同时显示在sys.modulesglobals().如果我再次删除它,它将被删除globals(),但仍然驻留在sys.modules.为什么会这样?

import mymodule
'mymodule' in globals()   # True
'mymodule' in sys.modules # True
del mymodule
'mymodule' in globals()   # False
'mymodule' in sys.modules # Still True, why?
Run Code Online (Sandbox Code Playgroud)

我还发现了以下不同之处:

from mypackage import mymodule
'mypackage' in sys.modules            # True
'mymodule'  in sys.modules            # False !
'mypackage.mymodule' in sys.modules   # also True !
Run Code Online (Sandbox Code Playgroud)

而答案是互补的globals():

'mypackage' in sys.modules            # False
'mymodule'  in sys.modules            # True 
'mypackage.mymodule' in sys.modules   # False
Run Code Online (Sandbox Code Playgroud)

python

9
推荐指数
1
解决办法
5205
查看次数

如何在PySpark shell会话中更新pyfile?

在交互式pyspark会话中,您可以通过导入python文件sc.addPyFile('file_location').如果您需要对该文件进行更改并保存它们,是否有任何方法可以"重新广播"更新的文件而无需关闭您的spark会话并启动新的文件?

只是再次添加文件不起作用.我不确定重命名文件是否有效,但我不想这样做.

据我从spark文档中可以看出,只有一种方法可以添加pyfile,而不是更新一个.我希望我错过了什么!

谢谢

python apache-spark pyspark

8
推荐指数
1
解决办法
663
查看次数

如何在ipython中重新加载类定义

因为我通常使用ipython来开发正在开发的代码,所以我遇到了在将其导入ipython之后更改类的代码的情况.我想重新加载新的类定义而不重新启动ipython.问题是ipython中的重载功能仅适用于模块.

我搜索了这个问题的解决方案并找到了一个前一个线程: 如何在python shell中重新加载一个类?

但是,我按照那里的方法,但它没有奏效.我认为它在该线程中工作的原因是类名碰巧与模块名称相同,因此可以在sys.modules中找到它,因此可以删除.当类名与模块名不同时,该方法不起作用.

我想知道是否有这个问题的解决方案.谢谢!

ipython

7
推荐指数
1
解决办法
3259
查看次数