从包根中导入内容时导入问题__init __。py

时间:2016-04-29 22:33:32

标签: python python-3.x import module

我认为当你将__init__.py投入混合时,我误解了导入系统的工作方式。这是我的(这个例子非常精简)布局(Python 3.5):

adminproj/
  __init.__py
  main.py
  functions/
    password.py

adminproj.__init__.py中,我定义了两个组件,目的是全局使用它们(在main.py和functions.password.py中):

with open((os.path.dirname(__file__)) + "/config/dev.yml", 'r') as ymlfile:
    config = yaml.load(ymlfile)

logger = logging.getLogger("adminproj")
# followed by a bunch of log customization

现在在我的脚本中,main.py和password.py,我可以这样做:

from adminproj import config
from adminproj import logger
logger.info("config values: " + str(config))

Horray!

但我也希望通过将此函数添加到adminproj.__init__.py中来使我的函数调用不需要完全限定的模块名称:

from adminproj.functions.password import *

现在,当我这样做时,一切都会下地狱,特别是导致导入" logger"和" config":

>>> import adminproj
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/admin/sandbox/adminproj/adminproj/__init__.py", line 12, in <module>
    from adminproj.functions.password import *
  File "/admin/sandbox/adminproj/adminproj/functions/password.py", line 3, in <module>
    from adminproj import logger
ImportError: cannot import name 'logger'

我很确定它与名称冲突或某些事情有关,例如当__init__.py导入一些本身导入__init__.py声明的内容时。即使这是正确的思维框架,我似乎无法找到解决方案来做我想做的事情。也许使用__init__.py作为全局命名空间的形式很糟糕。

简单的解决方案是忘记from functions.password import *并使用完全限定的导入。但是我想让我的函数调用简短而甜蜜,但仍然使用__init__.py中的全局变量。

adminproj.contains_profanity("badword")

adminproj.functions.password.contains_profanity("badword")

0 个答案:

没有答案