如何从包中导入包?

时间:2013-11-13 00:14:34

标签: python packages

我正在编写一个小包,我试图在其中包含一个演示脚本作为示例。但是,我似乎无法从内部干净地导入包,就好像我在它之外。

使用如下目录结构:

trainer/
  __init__.py
  helper.py
  trainer.py
  [...more files...]
  demo.py

demo.py我无法做from .. import trainer,因为它抱怨“尝试非包裹中的相对导入”,尽管有__init__.py。如果我将演示文件移动到一个目录并且import trainer它工作正常,但我试图将它与包一起保存。

看起来像黑客import __init__ as trainer,但是eeeew。

直接从整个模块导入各个位也有效,但却是一个混乱的例子。我在尝试中完全被误导了还是有更好的解决方案?

2 个答案:

答案 0 :(得分:2)

如果您尝试将demo.py作为python demo.py投放,则您遇到的问题可能与here相同。

正在发生的事情是Python的相对导入机制通过使用当前模块的__name__来工作。直接执行模块时,无论实际模块名称是什么,__name__都会设置为"__main__"。因此,相对(包内)导入不起作用。

要解决此问题,您可以执行以下操作:

  • 执行demo.py 作为软件包中的模块,如下所示:python -m trainer.demo。这应该可以解决错误,但您仍然会导入trainer.py模块而不是包。

  • 现在将from __future__ import absolute_import添加到demo.py,这将导致您的导入默认为绝对导入,这意味着相对导入必须明确(如from . import (...)) 。这是强制import trainer导入整个顶级包而不是模块。

答案 1 :(得分:0)

你组织文件的方式,demo.py成为包的一部分,可能是也可能不是你想要的。您可以稍微改变文件的组织方式,将 demo.py 移到培训师目录之外:

TopDir/
    demo.py
    trainer/
    __init__.py
    helper.py
    trainer.py
    [... more files ...]

然后,demo.py可以执行以下操作:

from trainer import trainer, helper