TL;博士
您只能相对导入同一包中另一个模块内的模块。
概念澄清
我们在books/docs/articles中看到了很多示例代码,它们向我们展示了如何相对导入模块,但当我们这样做时,它失败了。
原因是,简单地说,我们没有按照python模块机制的预期运行代码,即使代码编写得完全正确。这就像某种运行时的事情。
模块加载取决于您如何运行代码。这就是困惑的根源。
什么是模块?
当且仅当模块被另一个文件导入时,它才是python文件。给定一个文件mod.py,它是一个模块吗?是和否,如果您运行python-mod.py,它不是一个模块,因为它没有导入。
什么是套餐?
包是包含Python模块的文件夹。
顺便说一下,如果您不需要任何包初始化或自动加载子模块,那么python 3.3中不需要__init__.py。您不需要在目录中放置空白__init__.py。
这证明只要有文件被导入,包就只是一个文件夹。
真实答案
现在,这个描述变得更加清晰了。
您只能相对导入同一包中另一个模块内的模块。
给定目录:
. CWD
|-- happy_maker.py # content: print('Sends Happy')
`-- me.py # content: from . import happy_maker
运行python-me.py,我们尝试了没有已知父包的相对导入
me.py是直接运行的,它不是一个模块,我们不能在其中使用相对导入。
解决方案1
使用import happy_maker而不是from。导入happy_maker
解决方案2
将工作目录切换到父文件夹。
. CWD
|-- happy
| |-- happy_maker.py
`-- me.py
运行python-m happy.me。
当我们在包含happy的目录中时,happy是一个包,me.py,happy_maker.py是模块,我们现在可以使用相对导入,我们仍然希望运行me.py。所以我们使用-m,这意味着将模块作为脚本运行。
Python习语
. CWD
|-- happy
| |-- happy_maker.py # content: print('Sends Happy')
| `-- me.py # content: from . import happy_maker
`-- main.py # content: import happy.me
这种结构就是python习语。main是我们的脚本,Python中的最佳实践。最后,我们到达了那里。
兄弟姐妹或祖父母
另一个常见需求:
.
|-- happy
| |-- happy_maker.py
| `-- me.py
`-- sad
`-- sad_maker.py
我们想在me.py中导入sad_maker,怎么做?
首先,我们需要在同一个包中实现快乐和悲伤,所以我们必须升级到目录级别。然后从。。伤心地在me.py中导入sadmaker。
仅此而已。