一文解决python模块导入

python 模块导入 原理

查找是按照 sys.path 中的路径挨个扫描。若都不存在则提示error。
sys.path路径第一个是当前运行脚本所在的目录,其后是PYTHONPATH(通常若步专门设置则为空)设置的目录,在后面是全局包所在目录。python

PS:一个目录要有__init__.py才能做为包被导入git

示例代码地址:

github

一共四种状况

要导入的包在当前目录
要导入的包在子目录
要导入的包在父目录
要导入的包在兄目录(这种状况和包在其余十万八千里地方同样)github

如下是目录结构
app

如下示例的运行目录都是test_module/sub1
即 python case_.pycode

case1

要导入的模块和当前运行文件在同一目录,直接import
a.pyblog

print("I'm a.py")

case_1.pyutf-8

#!/usr/bin/env python
# encoding: utf-8
import a
print('I\'m case_1.py')

输出:get

I'm sub1/a.py
I'm case_1.py

case2

子目录创建__init__.py 文件,import subsub.ait

case2ast

#!/usr/bin/env python
# encoding: utf-8
import subsub.a
print('I\'m case_2.py')

输出

I'm subsub/aa.py
I'm case_2.py

case3

两个方法,其一直接改变sys.path内容,使用sys.path.append(),注意这里添加的路径是对于运行该文件时的当前目录来讲的;其二设置PYTHONPATH添加父目录

case_3_1

case_3_1.py

#!/usr/bin/env python
# encoding: utf-8
import sys
sys.path.append('../')
import aa
print('I\'m case_3_1.py')

case_3_2

执行case_3_2前 先使用这个命令 export PYTHONPATH=$PYTHONPATH:/home/pb/test_module
case_3_2.py

#!/usr/bin/env python
# encoding: utf-8
import aa
print('I\'m case_3_2.py')

case4

和第三种同样,使用sys.path.append()或者设置PYTHONPATH添加父目录

case_4

#!/usr/bin/env python
# encoding: utf-8
import sys
sys.path.append('../')
import sub2.aa
print('I\'m case_4.py')

其实掌握了sys.path 和PYTHONPATH后目录在哪里都能用这样的stopgap方法搞一下,可是若是是第四种状况仍是建议使用virtualenv吧,否则你之后会发疯的。