在python v.IPython中导入本地模块

时间:2018-05-24 15:56:26

标签: python import python-import

我发现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为空白。

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

IPython works, python does not.

为什么一个工作而另一个工作?有可能使python句柄类似于IPython,还是有更多的pythonic方法来处理这样的情况?

版本信息:

  • Python:3.6.3
  • IPython:6.1.0(使用3.6.3 Python)

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

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

1 个答案:

答案 0 :(得分:0)

我无法向您解释为什么会发生这种情况,但如果您使b.py文件看起来像这样,它可能适用于 python

from a import foo
foo()

对我来说,使用src.a没有意义,因为src是(相同的)目录。但同样,我不知道为什么一个有效,另一个无效。 Refer to the 3rd example on this answer