我正在编写一个小包,我试图在其中包含一个演示脚本作为示例。但是,我似乎无法从内部干净地导入包,就好像我在它之外。
使用如下目录结构:
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。
直接从整个模块导入各个位也有效,但却是一个混乱的例子。我在尝试中完全被误导了还是有更好的解决方案?
答案 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