9-Import Modules and Exploring The Standard Library

导入模块

准备步骤

  • 新建模块:my_module.py

这里定义了一个变量和一个函数,用来在test_module.py中测试调用。print statement是用来检测是否成功导入了模块。

print("this is my module")

test = "test string"

def find_fun(num):
    print(num)
  • 新建测试文件:test_module.py

这两个文件在同一个路径下,故import 关键字可以直接导入成功。

import my_module

在这里插入图片描述

运行后,执行了my_module中的print 语句内容,证明导入成功。

this is my module

导入命令

  • 在test_module.py文件中导入my_module包,然后执行包中的函数:
import my_module

my_module.find_fun(5)
this is my module
5

可以看到,执行调用成功,但是需要每次调用函数时都需要输入导入包的全称,为了节约时间,我们可以给导入的包取一个别名,利用as关键字,如下:

import my_module as mm

mm.find_fun(5)
  • from X import X

这个时候,你可能会希望直接导入这个函数,这样的话,就不需要在每次调用函数的时候添加包名作为前缀,可以这样:

from my_module import find_fun

find_fun(5)

但是需要注意的是,如果采用这种方式导入,相当于只导入了my_module包中的find_fun函数,而其他变量或者函数并未导入,为此可以做一个测试,my_module 包中包含一个 test字符串变量,我们尝试在 test_module中调用它:

from my_module import find_fun

find_fun(5)

print(test)
this is my module
Traceback (most recent call last):
5
  File "D:/github_file/Python_Basic_Study/test_module.py", line 5, in <module>
    print(test)
NameError: name 'test' is not defined

我们可以看到,test变量并未导入,直接调用会出现错误,为此我们将其导入

from my_module import find_fun, test

find_fun(5)

print(test)
  • from X import *

有些时候,我们希望可以导入一个包中的所有函数及变量,这样的话可以在当前的脚本中自由使用,而不需要添加包名前缀。但是这种方式并不被推荐,原因如下:

  • 如果当前工作脚本中需要导入多个包,则采用将每个包的每个函数、变量均导入,可能会出现被导入的包中间包含同名变量或者函数,调用时会无法分辨
  • 如果调试中出现问题,我们很难定位到底是哪个包中的哪个变量出现了问题,造成时间浪费

因此,不推荐使用这种导入方式,但是实现方式示例如下,且运行结果与前面的方式一致:

from my_module import *

find_fun(5)

print(test)

搜索路径

我们在导入模块的时候,也并没有传入任何模块的地址,那么python编译器是 如何知道这些模块的位置呢?主要是通过自动搜索索引路径而找到的。当前python编译器(解释器?interpreter)索引路径包含的内容,可通过sys.path获得:

for it in sys.path:
    print(it)

默认搜索路径

默认包含的索引路径分为以下四种类型:

  1. 当前文件工作目录。

如果被导入的module与当前工作目录(当前脚本)一致, 可以直接导入。

D:\github_file\Python_Basic_Study # 当前的工作路径
  1. Python path environment variable
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\python37.zip
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\DLLs
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37
  1. python standard library(python标准库的路径)

标准库我们不需要进行安装,可以直接调用。
标准库也是用python写的,所以可以很方便的查看源码。
可通过 X.file() 内置函数获得任何标准库的保存位置,后文有详细介绍。

C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\lib
  1. side-package第三方
D:\github_file\Python_Basic_Study\venv\lib\site-packages

增加搜索路径

如果将my_module 从当前的工作目录移动到Windows desktop桌面,那么需要将桌面目录增加到python的默认搜索路径下,分别有以下几种方式。另外,如果模块不存在了,仍然运行了程序,则会报如下错误:

Traceback (most recent call last):
  File "D:/github_file/Python_Basic_Study/test_module.py", line 1, in <module>
    from my_module import find_fun, test
ModuleNotFoundError: No module named 'my_module'
  • sys.path.append()
  • 通过append命令,可以直接将需要导入模块的保存目录增加到sys.path中,虽然方便,但是需要确保在每次调用该模块之前都执行该append命令。
  • 另外,当该模块存储位置改变,且程序中已有多个位置导入了该模块,则需要程序员手动修改多个导入路径。
import sys
sys.path.append(r"C:\Users\Dale Chen\Desktop")

from my_module import find_fun, test

find_fun(5)

for it in sys.path:
    print(it)

需要注意的是,在IDE环境中fromimport关键字后面的内容会出现红色的错误提示,但是当点击运行后,程序可以正确执行,因此可认为sys.path.append命令相当于“动态”的将模块导入了。

  • 添加到Windows环境变量中

为了可以解决第一种方法的缺点,可以添加python的环境变量到Windows系统中:

  • 通过我的电脑-右击属性-高级-环境变量
  • 添加 环境变量 PYTHONPATH = C:\Users\Dale Chen\Desktop(注意,环境变量名必须是“PYTHONPATH”,只有这个名字,python才能识别出来。)
  • 添加完成之后,重新在IDE(Pycharm)中运行,仍然出现了无法找到需要导入的my_module的问题
ModuleNotFoundError: No module named 'my_module'
  • 推测是因为我使用的IDE 是Pycharm,而Pycharm会为每个工程添加虚拟环境(virtual environment,如果不知道是什么意思,可以参考我另一篇blog,虽然那是在linux环境下实现,但用途和思路是一致的)以保证不同工程可以独立调用各自的python及package。
  • 为验证猜想,使用Windows cmd命令,直接调用自己安装的python,即脱离pycharm和虚拟环境,验证环境变量是否有效:
C:\Users\Dale Chen>python
...
>>> import sys
>>> sys.path
>>> for it in sys.path:
...     print(it)

C:\Users\Dale Chen\Desktop # 这里是我们添加的环境变量
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\python37.zip
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\DLLs
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\lib
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\lib\site-packages

可以看到,在自己安装的python中,已经关联上了PYTHONPATH环境变量,那么我们试着导入位于桌面上的my_module:

>>> import my_module
this is my module
>>>

实验证明环境变量已经成功关联。那么在Pycharm中如果执行 sys.path会发生什么呢?我知道肯定不会有刚才导入的环境变量的路径,那么有什么呢?在pycharm中我们执行:

import sys
for it in sys.path:
    print(it)

执行结果如下:

D:\github_file\Python_Basic_Study\venv\Scripts\python.exe D:/github_file/Python_Basic_Study/test_module.py
D:\github_file\Python_Basic_Study
D:\github_file\Python_Basic_Study
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\python37.zip
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\DLLs
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\lib
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37
D:\github_file\Python_Basic_Study\venv
D:\github_file\Python_Basic_Study\venv\lib\site-packages
D:\github_file\Python_Basic_Study\venv\lib\site-packages\setuptools-39.1.0-py3.7.egg
D:\github_file\Python_Basic_Study\venv\lib\site-packages\pip-10.0.1-py3.7.egg

的确没有C:\Users\Dale Chen\Desktop 这个目录,后发现,可以在pycharm中进行设置。步骤如下:

  • File-Settings-Project-Project Interpreter
  • 然后按照下图点击步骤,增加搜索路径C:\Users\Dale Chen\Desktop

在这里插入图片描述

之后在test_module中再次导入位于桌面的my_module,便可以成功导入了。

from my_module import find_fun,test
import sys

find_fun(5)

print(test)

for it in sys.path:
    print(it)

执行结果如下:

this is my module
5
test string
D:\github_file\Python_Basic_Study
C:\Users\Dale Chen\Desktop # 在pycharm中添加成功
D:\github_file\Python_Basic_Study
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\python37.zip
...

Python Standard Library

下面简单介绍一个python自带的标准库模块

  • import random
import random

courses = ["python","PE","Chinese","math"]

random_course=random.choice(courses)

print(random_course)  # 随机出现courses中的任何一个item
  • import math.radians(90)
  • import calendar
  • import os
import os
print(os.getcwd()) # 可以获得当前的工作目录,也就是current work directory (类似linux中的cmd命令)
print(os.__file__) # 可以获得该模块所在的位置
D:\github_file\Python_Basic_Study
C:\Users\Dale Chen\AppData\Local\Programs\Python\Python37\lib\os.py
  • import antigravity

视频作者留给大家的彩蛋,导入antigravity后执行, 可以看到一幅漫画

引用

本文主要参考下列视频内容,翻译并亲测代码后形成此文,感谢视频作者的无私奉献!

另外推荐下面的几篇文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值