Python中经常要使用import导入不同层级的包,python不像JAVA从根目录写一个长路径最后打包,因为python是轻量级的,有时希望每个组件可以单独运行调试,因此没有打包的概念,这反而导致了import比较混乱。。
首先,要将一个目录作为一个包存在,必须要添加__init__.py
文件,这样这个目录才会作为包存在
总体来说就三种情况,做了个小例子,我的目录结构如下,有pyc是因为我执行过了,忽视他们
wujingcideMacBook-Pro:test wujingci$ tree
.
├── a
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── aa.py
│ └── aa.pyc
├── b
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── bb.py
│ ├── bb.pyc
│ ├── bbb.py
│ └── bbb.pyc
└── c.py
同级目录
直接import,比如bbb.py import bb
wujingcideMacBook-Pro:test wujingci$ cat b/bbb.py
import bb
print "bbb"
执行后
wujingcideMacBook-Pro:b wujingci$ python bbb.py
bb
bbb
因为bb.py里print 了 bb,所以一起打印出来了
下级目录
import【包名】.【文件名】, from 文件名 import 【类名】或import整个包
wujingcideMacBook-Pro:test wujingci$ cat c.py
from a.aa import AA
import b
print "c"
print AA.AAAA
wujingcideMacBook-Pro:test wujingci$ cat a/aa.py
print "aa"
class AA(object):
AAAA = "AA"
执行后
wujingcideMacBook-Pro:test wujingci$ python c.py
aa
c
AA
上级目录或上级目录子目录
要使用sys.path.append()去做改动,我们改一下b/bbb.py让其引用a/aa.py
wujingcideMacBook-Pro:b wujingci$ cat bbb.py
import sys
sys.path.append("..")
from a.aa import AA
print "bbb"
print AA.AAAA
wujingcideMacBook-Pro:b wujingci$ python bbb.py
aa
bbb
AA
然而有一个问题,一旦到上层目录执行
wujingcideMacBook-Pro:b wujingci$ cd ..
wujingcideMacBook-Pro:test wujingci$ python b/bbb.py
Traceback (most recent call last):
File "b/bbb.py", line 3, in <module>
from a.aa import AA
ImportError: No module named a.aa
报错啦。因为你每次执行sys.append()总以执行目录为基准,怎么解决呢?
import os, sys
ABSPATH = os.path.abspath(os.path.realpath(os.path.dirname(__file__)))
print ABSPATH
sys.path.append(ABSPATH + "/..")
from a.aa import AA
print "bbb"
print AA.AAAA
获取绝对路径再加上上层,这样就ok啦
wujingcideMacBook-Pro:test wujingci$ python b/bbb.py
/Users/wujingci/PycharmProjects/test/b
aa
bbb
AA
wujingcideMacBook-Pro:test wujingci$ cd b
wujingcideMacBook-Pro:b wujingci$ python bbb.py
/Users/wujingci/PycharmProjects/test/b
aa
bbb
AA