【问题标题】:How to import a user defined class from a Package to a Jupyter Notebook如何将用户定义的类从包导入到 Jupyter Notebook
【发布时间】:2021-10-25 15:17:38
【问题描述】:

我正在尝试创建一个具有以下结构的项目:

my_file.ipynb
my_package_directory > __init__.py test.py

test.py 中,假设我有一个非常简单的类:

class Test:
    def __init__(self, name):
        self.name = name

在代码单元格中,我尝试使类不满足并打印出定义的变量:

from my_package_directory.test import Test
test = Test('bob')
print(test.name)

如果我尝试运行单元格,我会收到错误:

ImportError: cannot import name 'Test' from 'my_package_directory.test'

在 Jupyter 笔记本中是否有特定的方法可以做到这一点?

谢谢。

【问题讨论】:

  • 你能用例如import my_package_directory.test as t; print(dir(t)) 仔细检查你的命名吗?
  • 我认为这个输出符合预期['Test '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'const', 'os']
  • 是的,这看起来是正确的,所以这与导入路径无关。值得怀疑的是该输出列表中的constos,因为它们没有在test.py 中导入或定义...
  • 它们在实际文件中。我只是想简化事情。将它们注释掉没有区别。
  • 那我就检查所有的拼写。也许也重启笔记本内核以防万一......

标签: python python-3.x jupyter-notebook jupyter


【解决方案1】:

您的文件的根目录可能不在python module search path 中。 您可以检查您的模块搜索路径:

import sys
print(sys.path)

如果您将笔记本和包的位置附加到该路径,它应该是可导入的:

sys.path.append('/path/to/where/jupyter/notebook/resides')
from my_package_directory.test import Test # should work

请注意,每当您更改模块的实现时,您都必须重新启动内核 - 这可以通过一些 jupyter notebook magic 来规避。

【讨论】:

  • 这似乎解决了导入问题,但随后它给出了TypeError,说 Test() 不接受任何参数。 Jupyter 是否有任何可能导致这种情况的缓存?就像它没有识别对类文件的更改。即使我删除单元格并重试。
  • 其实重启内核就解决了。非常感谢
  • 查看上面的编辑 ;-) 祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多