# python中os.path以及sys.path模块简介






#  1.sys.path —— 动态地改变Python搜索路径  #sys.path模块是动态的修改系统路径
# 如果python中导入的package或module不在环境变量PATH中,
# 那么可以使用sys.path将要导入的package或module加入到PATH环境变量中。

'''
     import sys
    sys.path.append(’引用模块的地址')

    #或者
    import sys
    sys.path.insert(0, '引用模块的地址')
'''



# sys.path是个列表,所以在末尾添加目录是很容易的,
# 用sys.path.append就行了。当这个append执行完之后,
# 新目录即时起效,以后的每次import操作都可能会检查这个目录。
# 如同解决方案所示,可以选择用sys.path.insert(0,…)这样新添加的目录会优先于其他目录被import检查。

# 即使sys.path中存在重复,或者一个不存在的目录被不小心添加进来,
# 也没什么大不了,Python的import语句非常聪明,它会自己应付这类问题。
# 但是,如果每次import时都发生这种错误(比如,重复的不成功搜索,操作系统提示的需要进一步处理的错误),
# 我们会被迫付出一点小小的性能代价。
#
# 程序向sys.path添加的目录只会在此程序的生命周期之内有效,
# 其他所有的对sys.path的动态操作也是如此。

# 补充:

# 1、模块要处于Python搜索路径中的目录里才能被导入,
# 但我们不喜欢维护一个永久性的大目录,
# 因为其他所有的Python脚本和应用程序导入模块的时候性能都会被拖累。




'''
import sys

for i in sys.path:
 print(i)



输出:
# C:\Users\derezzed\AppData\Local\Programs\Python\Python36\python.exe C:/Users/derezzed/Desktop/python/homeworks/模块导入引用/test1.py
# C:\Users\derezzed\Desktop\python\homeworks\模块导入引用
# C:\Users\derezzed\Desktop\python
# C:\Users\derezzed\AppData\Local\Programs\Python\Python36\python36.zip
# C:\Users\derezzed\AppData\Local\Programs\Python\Python36\DLLs
# C:\Users\derezzed\AppData\Local\Programs\Python\Python36\lib
# C:\Users\derezzed\AppData\Local\Programs\Python\Python36
# C:\Users\derezzed\AppData\Local\Programs\Python\Python36\lib\site-packages
'''


# 以上输出是python的sys.path的路径列表,它是一个list。
# 默认情况下python导入文件或者模块的话,他会先在sys.path里找模块的路径。
# 如果没有的话,程序就会报错。
#
# 而且当前脚本的路径默认会在这个list里面,
# 比如:C:\Users\Administrator\Desktop\pythontest。
# 所以当前脚本import 模块(通常是脚本文件),
# 如果是这个脚本当前目录的情况下,是不会报错的(报错信息:找不到模块)。









# 2.python中获取当前工作目录

'''
import os

curDir = os.getcwd()

print(curDir)
'''


# 3.os.path模块

'''
    os.path.abspath(path)  #返回绝对路径  
    os.path.split(path     #将path分割成目录和文件名二元组返回  
    os.path.dirname(path)  #返回path的目录。其实就是os.path.split(path)的第一个元素  
    os.path.basename(path) #返回path最后的文件名  
    os.path.exists(path)   #如果path存在,返回True;如果path不存在,返回False  
    os.path.isabs(path)    #如果path是绝对路径,返回True  
    os.path.isfile(path)   #如果path是一个存在的文件,返回True。否则返回False  
    os.path.isdir(path)    #如果path是一个存在的目录,则返回True。否则返回False  
    os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间  
    os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间   
    s.path.join(path1[, path2[, ...]])  #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。  
    >>> os.path.join('c:\\', 'csv', 'test.csv')  
    'c:\\csv\\test.csv'  
    >>> os.path.join('windows\temp', 'c:\\', 'csv', 'test.csv')  
    'c:\\csv\\test.csv'  
    >>> os.path.join('/home/aa','/home/aa/bb','/home/aa/bb/c')  
    '/home/aa/bb/c'  
'''


# 4.python中type()函数可以查看一个python对象的数据类型
#
#
# 5.python中没有null,但是None。python中None的含义和其他语言中null是一样的。



# 6.sys.modules 的作用
#
# 既然python是在 sys.path 中搜索模块的,那载入的模块存放在何处?
# 答案就是 sys.modules,是存放已载入模块的地方。
# 模块一经载入,python 会把这个模块加入 sys.modules 中供下次载入使用,
# 这样可以加速模块的引入,起到缓存的作用。
#

'''
>>> import sys
>>> sys.modules['tornado']
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 'tornado'
>>> import tornado
>>> sys.modules['tornado']
<module 'tornado' from '/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'>
'''


# 前面说过python 解释器启动之后,会把预先载入 built-in module,可以通过 sys.modules 验证。


'''
>>> sys.modules['os']
<module 'os' from '/Users/x/python_dev/lib/python2.7/os.pyc'>
>>>
'''