Python 包作用
在Python中,包(package)是一个有层次的模块命名空间,用于组织模块。包实际上是一个包含多个模块的目录,该目录下必须包含一个__init__.py文件,该文件可以是空文件,也可以包含包的初始化代码。
包的作用
组织代码: 包可以帮助我们更好地组织代码,将相关的模块放在同一个目录下,方便维护和管理。
避免命名冲突: 包可以避免模块之间的命名冲突,因为不同包下的模块可以有相同的名称。
命名空间: 包提供了一个命名空间,可以避免模块之间的命名冲突,并将模块按照功能进行分类。
模块、库、包在Python中有什么区别?
– 模块是一个包含Python定义和语句的文件,其名称就是文件名称(不包括.py后缀)。模块module,这个概念就是Python里的概念,一个模块就是一个py文件,然后包含多行代码执行一个或多个任务,库约等于模块。模块中可以包含变量、函数、类等内容,可以被其他程序引用。
– 包是一组模块的集合,它和库的概念比较相似,但更加灵活。包实际上就是一个包含有特殊__init__.py文件的目录,这个目录下面可以有多个模块。包的使用使得模块更加有组织化,更易于维护和扩展。包的本质依然是模块,包可以包含子包。
– 库通常是一组相关的模块的集合,包括python自带的标准库及安装的第三方库,库是为了解决某一类问题而封装的功能的集合。库library,这个概念并非Python里的概念,是从C语言过来的。库这个概念其实就是一堆代码一起完成一个或多个任务。非常类似函数,但是是以文件组织在一起。。Python中有许多标准库(如os、sys等),也可以通过pip安装第三方库(如numpy、pandas等)。库通常是在一个特定的领域提供了一系列函数和类,供使用者调用。
Python 库:相比模块和包,库是一个更大的概念,例如在 Python 标准库中的每个库都有好多个包,而每个包中都有若干个模块。
总结一下,模块是单个文件,库是一组相关的模块,而包是一组模块的集合,它们在Python中各自有着不同的角色和用途。
Python的标准库函数
不需要下载安装,直接在.py文件中使用import导入即可使用
Python根目录下的lib目录(自带的标准库)
Python的第三方库函数
我们使用pip下载命令安装,第三方库都放在lib/site-packages中,属于第三方库,安装后import导入使用
包的搜索路径:
注意
,每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块。
当我们使用 import
语句的时候,Python解释器
是怎样找到对应的文件的呢?
这就涉及到 Python 的搜索路径,搜索路径是由一系列目录名
组成的,Python解释器
就依次从这些目录中去寻找所引入的模块。
这看起来很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。
搜索路径是在 Python 编译或安装
的时候确定的,安装新的库应该也会修改。搜索路径被存储在 sys
模块中的 path 变量
在导入一个包的时候,Python
会根据 sys.path
中的目录来寻找这个包中包含的子目录。
默认情况下,Python解释器
会搜索当前目录、所有已安装的内置模块和第三方模块
,搜索路径存放在sys模块的path变量中。
目录只有包含一个叫做 __init__.py
的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块。
总结,python找导入的文件的顺序和地方(sys模块,sys.path):
1、执行文件当前所在的目录
2、当前工程目录(是pycharm添加进去的)
3、python根目录下的lib目录(python安装时自带的标准库)
4、python根目录下的lib/site-packages(要通过pip命令安装的)
模块name属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__
属性来使该程序块仅在该模块自身运行时执行。
#!/usr/bin/python3
# Filename: using_name.py
if __name__ == '__main__':
print('程序自身在运行')
else:
print('我来自另一模块')
运行输出如下:
$ python using_name.py
程序自身在运行
$ python
>>> import using_name
我来自另一模块
说明: __name__ 变量是python的内置变量,每个模块都有一个__name__
属性,当其值是__main__
时,表明该模块自身在运行,否则是被引入。
为了实现这一点,就需要使用 Python 内置的系统变量 __name__,它用于标识所在模块的模块名。例如,在 demo.py 程序文件中,添加如下代码:
可以看到,当前运行的程序,其 __name__ 的值为 __main__,而导入到当前程序中的模块,其 __name__ 值为自己的模块名。
因此,if __name__ == '__main__':
的作用是确保只有单独运行该模块时,此表达式才成立,才可以进入此判断语法,执行其中的测试代码;反之,如果只是作为模块导入到其他程序文件中,则此表达式将不成立,运行其它程序时,也就不会执行该判断语句中的测试代码。
模块作用域
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_
前缀来实现的。
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
类似 __xxx__
这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的 __author__
,__name__
就是特殊变量,hello模块定义的文档注释也可以用特殊变量 __doc__
访问,我们自己的变量一般不要用这种变量名;
类似_xxx
和__xxx
这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
之所以我们说,private函数和变量“不应该”被直接引用,而不是不能
被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。
private
函数或变量不应该被别人引用,那它们有什么用呢?请看例子:
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,外部不需要引用的函数全部定义成 private
,只有外部需要引用的函数才定义为 public
。
如何导入包和模块
导入模块
使用 import 导入模块的语法,主要有以下两种:
import 模块名1 [as 别名1], 模块名2 [as 别名2],…
:使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…
: 使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用导入模块的指定成员时,无需附加任何前缀,直接使用成员名(或别名)即可。
注意,用 [] 括起来的部分,可以使用,也可以省略。
# 导入sys整个模块
import sys
# 使用sys模块名作为前缀来访问模块中的成员
print(sys.argv[0])
# 导入sys模块的argv成员
from sys import argv
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
一般不推荐使用“from 模块 import *”这种语法导入指定模块内的所有成员,因为它存在潜在的风险。比如同时导入 module1 和 module2 内的所有成员,假如这两个模块内都有一个 foo() 函数,那么当在程序中执行如下代码时:
foo()
上面调用的这个 foo() 函数到底是 module1 模块中的还是 module2 模块中的?因此,这种导入指定模块内所有成员的用法是有风险的。
导入模块本质
使用“import fk_module”导入模块的本质就是,将 fk_module.py 中的全部代码加载到内存并执行,然后将整个模块内容赋值给与模块同名的变量,该变量的类型是 module,而在该模块中定义的所有程序单元都相当于该 module 对象的成员。
使用“from fk_module import name, hello”导入模块中成员的本质就是将 fk_module.py 中的全部代码加载到内存并执行,然后只导入指定变量、函数等成员单元,并不会将整个模块导入,因此程序在输出 fk_module 时将看到错误提示:name 'fk module' is not defined
。
当软件中重复导入同一个模块时,Python 只会导入一次,跟其他语言中不一样,python自动做到这一点。
如果模块中包含空格或者以数字开头,就需要使用 Python 提供的 __import__() 内置函数引入模块。比如自定义一个模块,并起名为 "demo text.py",则导入方式为:
__import__("demo text")
__name__是Python 内置的系统变量 ,它用于标识所在模块的模块名。例如,在 demo.py 程序文件中,添加如下代码:
import candf
print(__name__)
print(candf.__name__)
其运行结果为:
__main__
candf
可以看到,当前运行的程序,其 __name__ 的值为 __main__,而导入到当前程序中的模块,其 __name__ 值为自己的模块名。
导入包
包其实本质上还是模块,因此导入模块的语法同样也适用于导入包。无论导入我们自定义的包,还是导入从他处下载的第三方包,导入方法可归结为以下 3 种:
import 包名.模块名 [as 别名]
from 包名 import 模块名 [as 别名]
from 包名.模块名 import 成员名 [as 别名]
用 [] 括起来的部分,是可选部分,即可以使用,也可以直接忽略。
注意,导入包的同时,会在包目录下生成一个含有 __init__.cpython-36.pyc 文件的 __pycache__ 文件夹。
注意不能只import 包名,直接导入包名,并不会将包中所有模块全部导入到程序中,它的作用仅仅是导入并执行包下的 __init__.py 文件,如果__init__.py 文件为空,通过包名.模块名.成员名方式,
会抛出 AttributeError 异常(访问的对象不存在)。
导入包就等同于导入该包中的 __init__.py 文件,因此完全可以在 __init__.py 文件中直接编写实现模块功能的变量、函数和类,但实际上并推荐大家这样做,因为包的主要作用是包含多个模块。因此 __init__.py 文件的主要作用是导入该包内的其他模块。
也就是说,通过在 __init__.py 文件使用 import 语句将必要的模块导入,这样当向其他程序中导入此包时,就可以直接导入包名,也就是使用import 包名
(或from 包名 import *
)的形式即可。
创建好my_package 包,该包名包含 module1 模块、module2 模块和 __init__.py 文件。现在向 my_package 包的 __init__.py 文件中编写如下代码:
# 从当前包导入 module1 模块
from . import module1
#from .module1 import *
# 从当前包导入 module2 模块
#from . import module2
from .module2 import *
可以看到,在 __init__.py 文件中用点(.)来表示当前包的包名,除此之外,from import 语句的用法和在程序中导入包的用法完全相同。
总的来说,__init__.py 文件是通过如下 2 种方式来导入包中模块的:
# 从当前包导入指定模块
from . import 模块名
# 从.模块名 导入所有成员到包中
from .模块名 import *
第 1 种方式用于导入当前包(模块)中的指定模块,这样即可在包中使用该模块。当在其他程序使用模块内的成员时,需要添加“包名.模块名”作为前缀,例如:
import my_package
my_package.module1.display("http://c.biancheng.net/python/")
运行结果为:
http://c.biancheng.net/python/
第 2 种方式表示从指定模块中导入所有成员,采用这种导入方式,在其他程序中使用该模块的成员时,只要使用包名作为前缀即可。例如如下程序:
import my_package
clangs = my_package.CLanguage()
clangs.display()
运行结果为:
http://c.biancheng.net/python/
Python找不到指定模块的解决方法
很多初学者经常遇到这样的问题,即自定义 python模板文件后,在其它文件中用 import(或 from...import) 语句引入该文件时,Python 解释器同时如下错误:
ModuleNotFoundError: No module named '模块名'
意思是 Python 找不到这个模块名,这是什么原因导致的呢?要想解决这个问题,读者要先搞清楚 Python 解释器查找模块文件的过程。
通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
- 在当前目录,即当前执行的程序文件所在目录下查找;
- 到 PYTHONPATH(环境变量)下的每个目录中查找;
- 到 Python 默认的安装目录下查找。
以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。
解决“Python找不到指定模块”的方法有 3 种,分别是:
- 向 sys.path 中临时添加模块文件存储位置的完整路径;
- 将模块放在 sys.path 变量中已包含的模块加载路径中;
- 设置 path 系统环境变量。
不过,在详细介绍这 3 种方式之前,为了能更方便地讲解,本节使用前面章节已建立好的 hello.py 自定义模块文件(D:\python_module\hello.py)和 say.py 程序文件(C:\Users\mengma\Desktop\say.py,位于桌面上),它们各自包含的代码如下:
#hello.py
def say ():
print("Hello,World!")
#say.py
import hello
hello.say()
显然,hello.py 文件和 say.py 文件并不在同一目录,此时运行 say.py 文件,其运行结果为:
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\say.py", line 1, in <module>
import hello
ModuleNotFoundError: No module named 'hello'
可以看到,Python 解释器抛出了 ModuleNotFoundError 异常。接下来,分别用以上 3 种方法解决这个问题。
导入模块方式一:临时添加模块完整路径
模块文件的存储位置,可以临时添加到 sys.path 变量中,即向 sys.path 中添加 D:\python_module(hello.py 所在目录),在 say.py 中的开头位置添加如下代码:
import sys
sys.path.append('D:\\python_module')
注意:在添加完整路径中,路径中的 '\' 需要使用 \ 进行转义,否则会导致语法错误。再次运行 say.py 文件,运行结果如下:
Hello,World!
可以看到,程序成功运行。在此基础上,我们在 say.py 文件中输出 sys.path 变量的值,会得到以下结果:
['C:\\Users\\mengma\\Desktop', 'D:\\python3.6\\Lib\\idlelib', 'D:\\python3.6\\python36.zip', 'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 'D:\\python3.6', 'C:\\Users\\mengma\\AppData\\Roaming\\Python\\Python36\\site-packages', 'D:\\python3.6\\lib\\site-packages', 'D:\\python3.6\\lib\\site-packages\\win32', 'D:\\python3.6\\lib\\site-packages\\win32\\lib', 'D:\\python3.6\\lib\\site-packages\\Pythonwin', 'D:\\python_module']
该输出信息中,红色部分就是临时添加进去的存储路径。需要注意的是,通过该方法添加的目录,只能在执行当前文件的窗口中有效,窗口关闭后即失效。
导入模块方式二:将模块保存到指定位置
如果要安装某些通用性模块,比如复数功能支持的模块、矩阵计算支持的模块、图形界面支持的模块等,这些都属于对 Python 本身进行扩展的模块,这种模块应该直接安装在 Python 内部,以便被所有程序共享,此时就可借助于 Python 默认的模块加载路径。
Python 程序默认的模块加载路径保存在 sys.path 变量中,因此,我们可以在 say.py 程序文件中先看看 sys.path 中保存的默认加载路径,向 say.py 文件中输出 sys.path 的值,如下所示:
['C:\\Users\\mengma\\Desktop', 'D:\\python3.6\\Lib\\idlelib', 'D:\\python3.6\\python36.zip', 'D:\\python3.6\\DLLs', 'D:\\python3.6\\lib', 'D:\\python3.6', 'C:\\Users\\mengma\\AppData\\Roaming\\Python\\Python36\\site-packages', 'D:\\python3.6\\lib\\site-packages', 'D:\\python3.6\\lib\\site-packages\\win32', 'D:\\python3.6\\lib\\site-packages\\win32\\lib', 'D:\\python3.6\\lib\\site-packages\\Pythonwin']
上面的运行结果中,列出的所有路径都是 Python 默认的模块加载路径,但通常来说,我们默认将 Python 的扩展模块添加在 lib\site-packages
路径下,它专门用于存放 Python 的扩展模块和包。
所以,我们可以直接将我们已编写好的 hello.py 文件添加到 lib\site-packages
路径下,就相当于为 Python 扩展了一个 hello 模块,这样任何 Python 程序都可使用该模块。
移动工作完成之后,再次运行 say.py 文件,可以看到成功运行的结果:
Hello,World!
导入模块方式三:设置环境变量
在linux系统或windows系统下设置环境变量,将自定义python文件所在的目录添加到path环境变量,这里具体操作不做展开了。
Python查看模块(变量、函数、类)方法
正确导入模块或者包之后,怎么知道该模块中具体包含哪些成员(变量、函数或者类)呢?
查看已导入模块(包)中包含的成员,本节给大家介绍 2 种方法。
查看模块成员:dir()函数
事实上,在前面章节的学习中,曾多次使用 dir() 函数。通过 dir() 函数,我们可以查看某指定模块包含的全部成员(包括变量、函数和类)。注意这里所指的全部成员,不仅包含可供我们调用的模块成员,还包含所有名称以双下划线“__”开头和结尾的成员,而这些“特殊”命名的成员,是为了在本模块中使用的,并不希望被其它文件调用。
这里以导入 string 模块为例,string 模块包含操作字符串相关的大量方法,下面通过 dir() 函数查看该模块中包含哪些成员:
import string
print(dir(string))
程序执行结果为:
['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
可以看到,通过 dir() 函数获取到的模块成员,不仅包含供外部文件使用的成员,还包含很多“特殊”(名称以 2 个下划线开头和结束)的成员(魔法函数),列出这些成员,对我们并没有实际意义。
因此,这里给读者推荐一种可以忽略显示 dir() 函数输出的特殊成员的方法。仍以 string 模块为例:
import string
print([e for e in dir(string) if not e.startswith('_')])
程序执行结果为:
['Formatter', 'Template', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
显然通过列表推导式,可在 dir() 函数输出结果的基础上,筛选出对我们有用的成员并显示出来。
查看模块成员:__all__变量
除了使用 dir() 函数之外,如果模块支持__all__变量,还可以使用 __all__ 变量,借助该变量也可以查看模块(包)内包含的所有成员。
仍以 string 模块为例,举个例子:
import string
print(string.__all__)
程序执行结果为:
['ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace', 'Formatter', 'Template']
显然,和 dir() 函数相比,__all__ 变量在查看指定模块成员时,它不会显示模块中的特殊成员,同时还会根据成员的名称进行排序显示。
不过需要注意的是,并非所有的模块都支持使用 __all__ 变量,因此对于获取有些模块的成员,就只能使用 dir() 函数。
python查看模块或函数的帮助信息
可以使用 help() 函数来获取指定成员(甚至是该模块)的帮助信息,help() 函数底层也是借助 __doc__ 属性实现的。
先借助 dir() 函数,查看 my_package 包中有多少可供我们调用的成员:
import my_package
print([e for e in dir(my_package) if not e.startswith('_')])
程序输出结果为:
['CLanguage', 'display', 'module1', 'module2']
通过此输出结果可以得知,在 my_package 包中,有以上 4 个成员可供我们使用。接下来,我们使用 help() 函数来查看这些成员的具体含义(以 module1 为例):
import my_package
help(my_package.module1)
输出结果为:
Help on module my_package.module1 in my_package:
NAME
my_package.module1 - #module1.py模块文件
FUNCTIONS
display(arc)
直接输出指定的参数
FILE
c:\users\mengma\desktop\my_package\module1.py
通过输出结果可以得知,module1 实际上是一个模块文件,其包含 display() 函数,该函数的功能是直接输出指定的 arc 参数。同时,还显示出了该模块具体的存储位置。
查看其他成员的帮助信息也是一样
#输出 module2 成员的具体信息
help(my_package.module2)
#输出 display 成员的具体信息
help(my_package.module1.display)
#输出 CLanguage 成员的具体信息
help(my_package.module2.CLanguage)
值得一提的是,之所以我们可以使用 help() 函数查看具体成员的信息,是因为该成员本身就包含表示自身身份的说明文档(本质是字符串,位于该成员内部开头的位置)。无论是函数还是类,都可以使用 __doc__ 属性获取它们的说明文档,模块也不例外。
以 my_package 包 module1 模块中的 display() 函数为例,我们尝试用 __doc__ 变量获取其说明文档:
import my_package
print(my_package.module1.display.__doc__)
程序执行结果为:
直接输出指定的参数
那么,如果使用 help() 函数或者 __doc__ 属性,仍然无法满足我们的需求,还可以使用以下 2 种方法:
- 调用 __file__ 属性,查看该模块或者包文件的具体存储位置,直接查看其源代码.通过 __file__ 属性查找该模块(或包)文件所在的具体存储位置,注意通过包名.__file__方式查看包的存储路径,实际输出的 __init__.py 文件的存储路径
- 对于非自定义的模块或者包,可以查阅 python 库的参考文档 The Python Standard Library — Python 3.13.3 documentation。
以 string 模块为例:
import string
print(string.__file__)
程序输出结果为:
D:\python3.6\lib\string.py
由此,通过调用 __file__ 属性输出的绝对路径,我们可以很轻易地找到该模块(或包)的源文件。
如何自定义一个包/模块
一个py文件就是一个模块,一个具有__init__.py的"文件夹"以及其他py文件的就是包
创建模块
创建包
我们知道,导入包就等同于导入该包中的 __init__.py 文件,因此完全可以在 __init__.py 文件中直接编写实现模块功能的变量、函数和类,但实际上并推荐大家这样做,因为包的主要作用是包含多个模块。__init__.py 文件的主要作用是导入该包内的其他模块。
也就是说,通过在 __init__.py 文件使用 import 语句将必要的模块导入,这样当向其他程序中导入此包时,就可以直接导入包名,也就是使用import 包名
(或from 包名 import *
)的形式即可。
在 __init__.py 文件中用点(.)来表示当前包的包名,除此之外,from import 语句的用法和在程序中导入包的用法完全相同。
总的来说,__init__.py 文件是通过如下 2 种方式来导入包中模块的:
# 从当前包导入指定模块
from . import 模块名
# 从.模块名 导入所有成员到包中
from .模块名 import *
第 1 种方式用于导入当前包(模块)中的指定模块,这样即可在包中使用该模块。当在其他程序使用模块内的成员时,需要添加“包名.模块名”作为前缀。
第 2 种方式表示从指定模块中导入所有成员,采用这种导入方式,在其他程序中使用该模块的成员时,只要使用包名作为前缀即可。
如果包/模块不在主程序同级别目录下
Python 包管理器命令pip
进行 Python 程序开发时,除了使用 Python 内置的标准模块以及我们自定义的模块之外,还有很多第三方模块可以使用,这些第三方模块可以借助 Python官方提供的查找包页面(PyPI · The Python Package Index)找到。
使用第三方模块之前,需要先下载并安装该模块,然后就能像使用标准模块和自定义模块那样导入并使用了.
pip install 是一个 Python 包管理器命令,用于安装 Python 包。pip 是 Python 的一个重要工具,可以用来安装、升级和卸载 Python 包。
下载和安装第三方模块,可以使用 Python 提供的 pip 命令实现。pip 命令会将下载完成的第三方模块,默认安装到 Python 安装目录中的 \Lib\site-packages 目录下。位于此目录的模块,可以直接使用 import 语句导入第三方模块到程序中使用。
window系统下可以在cmd或者其他shell终端中,比如GIT CMD终端下执行pip命令,pip 命令的语法格式如下:
pip install|uninstall|list 模块名
其中,install、uninstall、list 是常用的命令参数,各自的含义为:
- install:用于安装第三方模块,当 pip 使用 install 作为参数时,后面的模块名不能省略。
- uninstall:用于卸载已经安装的第三方模块,选择 uninstall 作为参数时,后面的模块名也不能省略。
- list:用于显示已经安装的第三方模块。
pip install 命令的一些常见参数有
-r:从一个需求文件中安装所有的包。
-U 或 --upgrade:升级一个已经安装的包到最新版本。
-I 或 --ignore-installed:即使包已经安装,也重新安装。
--no-cache-dir:禁止使用缓存,每次都从网络下载。
--user:安装到用户目录,而不是系统目录。
-e 或 --editable: 以保持对源代码编辑能力的模式安装这个包。
下面是pip的常用命令和用法:
安装包:使用pip install命令来安装Python包。例如,要安装名为requests的包,可以执行以下命令:
pip install requests
注意每个python版本对应的第三库版本可能有限制,比如python3.9的不支持很多最新的库
比如python3.9安装matplotlib出错的解决办法(
python3.9安装matplotlib出错的解决办法:_pyhthon3.9matplotlib下载哪个版本-CSDN博客):
pip install matplotlib==3.3.3 #指定安装库的版本
查看matplotlib库的版本见链接
matplotlib · PyPI
升级包:使用pip install --upgrade命令来升级已安装的包。例如,要升级requests包,可以执行以下命令:
pip install --upgrade requests
卸载包:使用pip uninstall命令来卸载已安装的包。例如,要卸载requests包,可以执行以下命令:
pip uninstall requests
显示已安装的包:使用pip list命令来列出所有已安装的Python包及其版本。
pip list
导出和安装依赖:使用pip freeze命令将当前环境的包及其版本导出到一个文本文件中,通常被称为"requirements.txt"。然后,可以使用pip install -r命令根据该文件安装相同的依赖关系。例如:
pip freeze > requirements.txt
pip install -r requirements.txt
搜索包:使用pip search命令来在PyPI(Python Package Index)上搜索包。例如,要搜索名为numpy的包,可以执行以下命令:
pip search numpy
怎么区分标准模块和第三方模块
如果想要查看 Python 中目前有哪些模块(包括标准模块和第三方模块),可以在 IDLE 中(不是CMD里面)输入以下命令:
help('modules')
在此基础上,如果只是想要查看已经安装的第三方模块,可以在CMD里面使用如下命令:
pip list
在大型程序中,往往需要导入很多模块,导入模块时,优先导入 Python 提供的标准模块,然后再导入第三方模块,最后导入自定义模块。通过上面两个命令可以区分出是标准模块还是第三方模块了。
参考:
python 包作用_mob64ca12ed7b35的技术博客_51CTO博客