🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者
- 🔥🔥本文已收录于Python全栈系列专栏:《Python全栈基础教程》
- 🔥🔥热门专栏推荐:《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《爬虫高级》、《前端系列教程》、《tornado一条龙+一个完整版项目》。
- 📝📝本专栏面向广大程序猿,为的是大家都做到Python从入门到精通,同时穿插有很多很多习题,巩固学习。
- 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
- 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
![]()
# -*- coding: utf-8 -*-
"""
__author__ = 小小明-代码实体
"""
import sys
print('\n'.join(sys.path))
(base) D:\PycharmProjects\demo1>python pythonlearn/test.py
D:\PycharmProjects\demo1\pythonlearn
D:\Anaconda3\python37.zip
D:\Anaconda3\DLLs
D:\Anaconda3\lib
D:\Anaconda3
D:\Anaconda3\lib\site-packages
D:\Anaconda3\lib\site-packages\win32
D:\Anaconda3\lib\site-packages\win32\lib
D:\Anaconda3\lib\site-packages\Pythonwin
(base) D:\PycharmProjects\demo1>set PYTHONPATH=.
(base) D:\PycharmProjects\demo1>python pythonlearn/test.py
D:\PycharmProjects\demo1\pythonlearn
D:\PycharmProjects\demo1
D:\Anaconda3\python37.zip
D:\Anaconda3\DLLs
D:\Anaconda3\lib
D:\Anaconda3
D:\Anaconda3\lib\site-packages
D:\Anaconda3\lib\site-packages\win32
D:\Anaconda3\lib\site-packages\win32\lib
D:\Anaconda3\lib\site-packages\Pythonwin
语法如下:
import module1[, module2[,... moduleN]一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
当我们使用import语句的时候,Python解释器会到搜索路径中查找,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。
实战讲解:
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
# 导入模块
from pprint import pprint
nested = [list("abcs"), list("sdff"), [1, 45, 4, 6, 7, 8], list(range(12))]
# 现在可以调用模块里包含的函数了
pprint(nested)

Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。
from…import相当于java的静态导入,只导入一个模块的指定部分
语法如下:
from modname import name1[, name2[, ... nameN]]例如,要导入模块 datetime 的 datetime函数,使用如下语句:
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
from datetime import datetime
d = datetime.now()
print(d)

和import的区别:
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
import datetime
d = datetime.datetime.now()
print(d)
从上面的示例可以看出,from…import导入的方法可以直接调用,import导入的方法必须加上类名。
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *
例如我们想一次性引入 math 模块中所有的东西,语句如下:
from math import *
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中:
>>> import sys
>>> sys.path
['', '/Library/Python/2.7/site-packages/pycrypto-2.6.1-py2.7-macosx-10.9-intel.egg', '/Library/Python/2.7/site-packages/PIL-1.1.7-py2.7-macosx-10.9-intel.egg', ...]
如果我们要添加自己的搜索目录,有两种方法:
一是直接修改sys.path,添加要搜索的目录:
>>> import sys
>>> sys.path.append('E:/demo')
这种方法是在运行时修改,运行结束后失效。
第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。
例如:
set PYTHONPATH=.
dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
# coding=utf-8
import math
print(dir(math))
在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名。
如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'math']
__all__&从一个包中导入*from sound.effects import *
会执行effects 包下面的__init__.py并导入里面定义的内容,如果存在 __all__ 列表变量,那么就可以导入该列表指定的模块。
在:file:sounds/effects/__init__.py中包含如下代码:
__all__ = ["echo", "surround", "reverse"]
这表示当你使用from sound.effects import *这种用法时,会导入包里面这三个子模块。
__main__Python解释器会将运行入口模块文件的__name__置为__main__
if __name__=='__main__':
test()
当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。
from car import Car #从一个只包含一个类的模块中导入这个类
from car import ElectricCar #从一个包含多个类的模块中导入一个类
from car import Car, ElectricCar #从一个有多个类的模块中导入多个类
import car #导入整个模块 我们使用语法 module_name.class_name 访问需要的类
from module_name import * #导入模块中的所有类 (不建议使用,如果要用,推荐使用导入整个模块)
第一种:
import datetime # 导入整个datetime模块
a = datetime.datetime.now() # 获取当前时间
#第一个datetime是模块,第二个datetime是模块里面的类,,now()是类里面的方法
第二种:
(1)
from datetime import datetime #导入模块里面的一个类
a = datetime.now() #直接就一个datetime就是模块里的类
(2)
from datetime import * #导入这个模块里的所有类
a = datetime.now() #直接就一个datetime就是模块里的类
第三种:
from datetime import datetime as y #取别名
a = y.now()
sys.path 用于存放导入路径的列表,类似于环境变量中的 PATH
sys.argv 查看当前文件路径
__pycache__: 缓存文件
例子:
import sys
print(sys.path) #在这个路径下面,就可以通过import直接导入。一个列表,在前面的路径优先级高。
#只有在这个列表里面的路径的才能被导入。
第一个问题:
如果自己写的一个文件和python自带的一个模块重名,而且自己写的这个文件在本目录下,那么如果直接导入这个模块,本目录下的优先级最高,就导入不了自带的那个模块,该怎么办呢?
解决方法: sys.path.insert(0,路径名),把想要导入的那个模块的路径改到列表的前面。
第二个问题:
如果需要导入的模块在别的盘,即不在这个路径列表里,该怎么导入?
sys.path.append(r'路径名')