Python中模块的搜索路径实例讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a2011480169/article/details/79411080
2018年3月1日13:26:09

最近在工作的时候遇到一个问题,我首先是拿到别人现成的代码,代码如下:

import os,sys,re
import datetime
import threading
import subprocess
import configparser
import sendmail

from loggers import myLog
sys.path.append(os.getenv('HIVE_TASK'))
from HiveTask import HiveTask

但是当我输出'HIVE_TASK'环境变量的数值的时候,运行结果竟让为None,如下所示:

#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
function:本函数的功能是获取表的location
"""

import os
import sys

print(os.getenv('HIVE_TASK'))

运行结果如下:

[dd_edw@BJHC-Client-144113 zhang_dd_edw]$ python3 test.py 
None

当时第一反应,什么情况,环境变量怎么没有,于是我改了一下脚本:

import os,sys,re
import datetime
import threading
import subprocess
import configparser
import sendmail

from loggers import myLog
from HiveTask import HiveTask

当我运行这个脚本的时候发现竟然没有报错,也就是说可以找到HiveTask这个py文件(模块),到底是怎么找到的呢?

我查看了一下模块正常的搜索路径:

"""
function:本函数的功能是获取表的location
"""

import os
import sys


for path in sys.path:
    print(path)

输出结果:

[dd_edw@BJHC-Client-144113 zhang_dd_edw]$ python3 test.py 
/home/dd_edw/zhang_dd_edw
/home/dd_edw/zhang_dd_edw
/software/edw/common/HiveTask
/usr/local/lib/python32.zip
/usr/local/lib/python3.2
/usr/local/lib/python3.2/plat-linux2
/usr/local/lib/python3.2/lib-dynload
/usr/local/lib/python3.2/site-packages

可以看出HIVETASK这个模块应该是在/software/edw/common/HiveTask这个路径下面,但是为什么会找到这个路径呢?

我们都知道模块正常的搜索路径:

第一:内置模块当中去搜索

第二:执行文件所在的当前目录

第三:环境变量PYATHONPATH指定的路径列表中

第四:python安装的lib库中

于是我查看了一下环境变量PYATHONPATH的数值:

[dd_edw@BJHC-Client-144113 zhang_dd_edw]$ echo $PYTHONPATH
:/software/edw/common/HiveTask/

瞬间明白了,原来是通过PYTHONPATH--->/software/edw/common/HiveTask/----->HiveTask模块的。

后来特意问了一下,之前环境变量里面确实有那么一个环境变量HIVE_TASK,只不过后来不用了,写到了

PYTHONPATH里面去了。











猜你喜欢

转载自blog.csdn.net/a2011480169/article/details/79411080