首页 > 解决方案 > 在 python v. IPython 中导入本地模块

问题描述

我发现 IPython 和 python 以不同方式处理本地模块的加载,我想知道是否有人可以解释为什么会发生这种情况。

假设我的项目结构如下:

top_level/
  src/
    a.py
    b.py
    __init__.py

的内容b.py是:

from src.a import foo
foo()

然后a.py有一个功能foo

def foo():
  print('It worked!')

文件__init__.py为空白。

如果我从中调用 ipython 和 python,top_level我会得到两个不同的结果:

IPython 工作,python 没有。

为什么一个有效而另一个无效?是否有可能使 python 处理类似于 IPython 或者是否有更 Pythonic 的方式来处理这样的情况?

版本信息:


编辑以解释与“如何导入本地模块?”的区别 这个问题是关于 IPython 和 Python 如何处理本地模块导入之间的差异,而不是如何导入本地模块。

我还应该补充一点 - 虽然如果我将 import 语句更改为我的示例确实可以工作from a import foo- 我(隐含地)试图避免这样做。我喜欢导入与某个顶级目录相关的所有内容的想法,以便在文件结构发生变化时更容易。例如,如果b.py从某个子目录移至src某个子目录,src/core那么您需要遍历并重写所有相对于b.py.

标签: pythonimportpython-import

解决方案


我无法向您解释为什么会发生这种情况,但是如果您使文件看起来像这样,它也许可以在python上运行:b.py

from a import foo
foo()

对我来说,使用是没有意义的,src.a因为src是(相同的)目录。但同样,我不知道为什么一个有效而另一个无效。 请参阅此答案的第三个示例


推荐阅读