一文解决python模块导入

时间:2022-04-07 15:06:21

python 模块导入 原理

查找是按照 sys.path 中的路径挨个扫描。若都不存在则提示error。

sys.path路径第一个是当前运行脚本所在的目录,其后是PYTHONPATH(一般若步专门设置则为空)设置的目录,在后面是全局包所在目录。

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

示例代码地址:

github

一共四种情况

要导入的包在当前目录

要导入的包在子目录

要导入的包在父目录

要导入的包在兄目录(这种情况和包在其他十万八千里地方一样)

以下是目录结构

一文解决python模块导入

以下示例的运行目录都是test_module/sub1

即 python case_.py

case1

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

a.py

print("I'm a.py")

case_1.py

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

输出:

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

case2

子目录建立__init__.py 文件,import subsub.a

case2

#!/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吧,不然你以后会发疯的。