我认为当你将__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")