python导包显⽰NomodulenamedXXX问题
最近⽤sublime text写python脚本,在导包是⼀直显⽰No module named XXX。
问题描述:
⾸先⽂件夹的⽬录结构如下:
count.py⽂件,代码如下:
1#coding=utf-8
2
3def add(a=3,b=8):
4return a+b
5
6if__name__ == '__main__':
7print add()
counttest.py⽂件,代码如下:
#coding=utf-8
from model import count
c=add(4,6)
print c
运⾏之后,显⽰的结果是:
理论上讲,从model导⼊count.py⽂件,是对的,到底哪⾥出错了?
三种解决⽅案:
(1)在model⽬录下新建__init__.py⽂件,内容为空,在counttest.py⽂件中更改如下:c=count.add(4,6)
运⾏结果如下:
(2)在__init__.py⽂件写⼊:
import count
在counttest.py⽂件更改为:
1#coding=utf-8
2
3from model import *  #这⼀⾏做了更改
4
5 c=count.add(4,6)
6
7print c
运⾏结果如下:
(3)在__init__⽂件中,更改为:
1#coding=utf-8
2__all__ = ['count']  #count为需要导⼊的⽂件
运⾏结果如下:
原理:
  原来在python模块的每⼀个包中,都有⼀个__init__.py⽂件(这个⽂件定义了包的属性和⽅法)然后是⼀些模块⽂件和⼦⽬录,假如⼦⽬录中也有 __init__.py 那么它就是这个包的⼦包了。当你将⼀个包作为模块导⼊(⽐如从 xml导⼊ dom )的时候,实际上导⼊了它
的 __init__.py ⽂件。
  ⼀个包是⼀个带有特殊⽂件 __init__.py 的⽬录。__init__.py ⽂件定义了包的属性和⽅法。其实它可以什么也不定义;可以只是⼀个空⽂件,但是必须存在。如果 __init__.py 不存在,这个⽬录就仅仅是⼀个⽬录,⽽不是⼀个包,它就不能被导⼊或者包含其它的模块和嵌套包。
_init__.py ⽂件:
__init__.py 控制着包的导⼊⾏为。假如 __init__.py 为空,那么仅仅导⼊包是什么都做不了的。
>>> import Package1
>>> Package1.Module1
Traceback (most recent call last):
File "D:/Work Space/Python practice/MyPractice/src/test.py", line 8, in <module>
aa=Package1.Module1
python默认安装路径
AttributeError: 'module' object has no attribute 'Module1'
我们需要在 __init__.py ⾥把 Module1 预先导⼊:
#⽂件 __init__.py
import Module1
测试:
>>> import Package1
>>> aa=Package1.Module1
>>> print aa
__init__.py 中还有⼀个重要的变量,叫做 __all__。我们有时会使出⼀招“全部导⼊”,也就是这样:
from PackageName import *
这时 import 就会把注册在包 __init__.py ⽂件中 __all__ 列表中的⼦模块和⼦包导⼊到当前作⽤域中来。⽐如:
#⽂件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
测试:
>>> from Package1 import *
>>>
test1111111111111111111111
test222222
__init__.py ⽂件会在导⼊时被执⾏。
python的引外机制:
import abc
1、⾸先在当前⽬录下有没有abc、abc.py
2、python的安装⽬录:F:\Python2.7Exe\Lib\site-packages;F:\Python2.7Exe\Lib;
3、电脑中path下⾯的⽬录