1

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

具有如下目录结构:

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

尽管. _ demo.py_ 如果我将演示移到一个目录并且它工作正常,但我试图将它与包放在一起。 from .. import trainer__init__.pyimport trainer

看起来很hack的import __init__ as trainer作品,但是eeeew。

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

4

2 回答 2

2

如果您尝试运行demo.pyas python demo.py,您遇到的问题可能与此处相同。

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

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

  • demo.py 在 package 中作为模块执行,如下所示:python -m trainer.demo. 这应该可以修复错误,但您仍将导入trainer.py模块而不是包。

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

于 2013-11-13T00:40:18.970 回答
0

您组织文件的方式,demo.py 成为包的一部分,这可能是也可能不是您想要的。您可以稍微不同地组织您的文件,将demo.py 移到trainer目录之外:

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

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

from trainer import trainer, helper
于 2013-11-13T00:23:07.020 回答