今天在使用caffe的python接口的时候出现了:ImportError: No module named google.protobuf.internal 的错误(源代码里写的是from google.protobuf.internal import **),
接下来通过相对导入的方式,即将google包的路径加入到path下,还是那个错误,接下来通过绝对导入的方式就成功了,再后来通过导入protobuf包的相对路径就成功了(即修改为from protobuf.internal import **,并将protobuf路径加入到path下)。
后来查到原因是protobuf目录下比google目录下多个__init__.py ,而__init__.py 文件的作用是将文件夹变为一个Python模块,所以原因就是google目录下没有这个文件,所以google目录就不是个模块,from google.protobuf.internal import ** 也会出错。
下面再顺便介绍一下这个__init__.py的作用:
1、init.py是Python中package的标识。init.py 文件的一个主要作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件
2、批量引入(定义__all__用来模糊导入)
我们在python中导入一个包时,实际上是导入了它的__init__.py文件,这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
3、配置模块的初始化操作,这个文件也是一个正常的python代码文件,因此可以将初始化代码放入该文件中。
扩展资料
python中__init__.py文件的作用实例:
python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。init.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。
我们可以再__init__.py文件中再导入其他的包,或者模块。
[python]
import readers
import writers
import commands
import users
import meta
import auth
import admin
这样,当我们导入这个包的时候,init.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。不需要一个个去导入module了。