在 Python 中导入模块和 __init__.py

在 Python 中,我们需要在包含模块的文件夹中创建一个空的 init.py 文件,这样才能导入这些模块。但是,如果我们在 PYTHONPATH(Windows 7 中的环境变量)中添加了一个文件夹路径,即使这个文件夹不包含 init.py 文件,我们仍然可以导入该文件夹中的模块。为什么没有 init.py 文件也可以导入这些模块呢?
在这里插入图片描述

2、解决方案

init.py 文件的作用是将一个文件夹变成一个包。这对于创建一个模块的层次结构很有用,你可以使用这样的导入语句:

import mymodule.cool.stuff

如果没有包,这是不可能的。包可以像导入模块一样导入,init.py 中的任何代码都会运行,尽管它通常是空的。包是一种将多个模块组合在一起的方式,你可以使用以下方式加载它们:

import package-name.module-name

包也可以嵌套,通常也是这样。请查看 Python 软件目录下的 Lib 目录,可以找到很多示例。

代码例子

# 在 NoInitModule 文件夹中,没有 __init__.py 文件
[root@Machine python]# cd NoInitModule/
[root@Machine NoInitModule]# pwd
/python/NoInitModule
[root@Machine NoInitModule]# ls -l
total 4
-rw-r--r--. 1 root root 44 Jan 16 07:02 ModuleX.py

# 在 InitModule 文件夹中,有 __init__.py 文件
[root@Machine NoInitModule]# cd ../InitModule/
[root@Machine InitModule]# ls -l
total 4
-rw-r--r--. 1 root root  0 Jan 16 07:13 __init__.py
-rw-r--r--. 1 root root 49 Jan 16 07:12 ModuleY.py
[root@Machine InitModule]#

# 没有 __init__.py 文件,使用 from dir import module 语句 - 不起作用
[root@Machine python]# cat impomod.py
from NoInitModule import ModuleX

ModuleX.printBye()

[root@Machine python]# python impomod.py
Traceback (most recent call last):
  File "impomod.py", line 7, in <module>
    from NoInitModule import ModuleX
ImportError: No module named NoInitModule
[root@Machine python]#

# 没有 __init__.py 文件,使用 import 语句 - 不起作用
[root@Machine python]# vim impomod.py
[root@Machine python]# cat impomod.py
#from NoInitModule import ModuleX
import ModuleX

ModuleX.printBye()
[root@Machine python]# python impomod.py
Traceback (most recent call last):
  File "impomod.py", line 8, in <module>
    import ModuleX
ImportError: No module named ModuleX
[root@Machine python]#

# 没有 __init__.py 文件,在 PYTHONPATH 中插入路径,然后插入路径后使用 import module 语句 - 起作用
[root@Machine python]# vim impomod.py
[root@Machine python]# cat impomod.py
import sys
sys.path.append('/python/NoInitModule')
print sys.path

import ModuleX
ModuleX.printBye()

[root@Machine python]# python impomod.py
Bye from Module X with no __init__.py
[root@Machine python]#

# 有 __init__.py 文件,无需插入路径,使用 from dir import module 语句 - 起作用
[root@Machine python]# cat impXmod.py
import sys
from InitModule import ModuleY
ModuleY.printSeeU()
[root@Machine python]#

[root@Machine python]# python impXmod.py
See you from Module Y having __init__.py

# 有 __init__.py 文件,无需插入路径,使用 import module 语句 - 不起作用
[root@Machine python]# vim impXmod.py
[root@Machine python]# cat impXmod.py
import sys
#from InitModule import ModuleY
import ModuleY
ModuleY.printSeeU()

[root@Machine python]# python impXmod.py
Traceback (most recent call last):
  File "impXmod.py", line 3, in <module>
    import ModuleY
ImportError: No module named ModuleY
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值