python模块,库,包介绍、管理工具pip使用、import导包方法

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 导入模块的语法,主要有以下两种:

  1. import 模块名1 [as 别名1], 模块名2 [as 别名2],…:使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。
  2. 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 种:

  1. import 包名.模块名 [as 别名]
  2. from 包名 import 模块名 [as 别名]
  3. 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 种,分别是:

  1. 向 sys.path 中临时添加模块文件存储位置的完整路径;
  2. 将模块放在 sys.path 变量中已包含的模块加载路径中;
  3. 设置 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 种方法:

  1. 调用 __file__ 属性,查看该模块或者包文件的具体存储位置,直接查看其源代码.通过 __file__ 属性查找该模块(或包)文件所在的具体存储位置,注意通过包名.__file__方式查看包的存储路径,实际输出的 __init__.py 文件的存储路径
  2. 对于非自定义的模块或者包,可以查阅 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 是常用的命令参数,各自的含义为:

  1. install:用于安装第三方模块,当 pip 使用 install 作为参数时,后面的模块名不能省略。
  2. uninstall:用于卸载已经安装的第三方模块,选择 uninstall 作为参数时,后面的模块名也不能省略。
  3. 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 &gt; 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博客

Python库、包、模块 - leagueandlegends - 博客园

Python基础之模块和包讲解 - 简书

python包介绍、管理工具pip使用、import导包方法_pip官网下载的包怎么导入到项目里-CSDN博客

### Python `import` 模块常见问题及解决方法 #### 1. 使用 `PyImport_ImportModule` 函数模块失败 如果在 C/C++ 环境下通过嵌入 Python 来调用 `PyImport_ImportModule` 并遇到入失败的情况,可能是由于目标模块不存在或路径未正确配置。可以尝试以下代码验证模块是否存在并捕获异常[^1]: ```c PyObject* pName = PyUnicode_DecodeFSDefault("moduleName"); PyObject* pModule = PyImport_Import(pName); if (pModule == NULL) { PyErr_Print(); // 打印错误信息 } Py_XDECREF(pName); ``` 此代码片段会打印详细的错误消息以便排查。 --- #### 2. `PyImport_ImportModule` 返回 `NULL` 当使用 `PyImport_ImportModule` 或其他类似功能时,返回值为 `NULL` 可能是因为目标模块中存在语法错误或其他运行时异常。为了检测这些潜在问题,可以在 Python 脚本中预先加载模块并捕捉异常[^2]: ```python import imp try: imp.load_source('my_module', '/path/to/my_module.py') except Exception as e: print(f"Error loading module: {e}") ``` 上述代码可以帮助定位具体原因,例如文件路径错误、语法问题等。 --- #### 3. 相对入与绝对入引发的 ImportError 在复杂的项目结构中,相对入和绝对入可能致 `ImportError`。以下是两种常见的场景及其解决方案[^3]: - **相对入** 如果子模块之间需要互相访问,则应采用相对入的方式。例如,在 `mypackage/submodule1.py` 文件中引入同级目录下的另一个模块 `submodule2` 的函数: ```python from .submodule2 import some_function ``` - **绝对入** 当前工作目录可能影响绝对入的行为。建议始终指定完整的名作为入路径。例如: ```python from mypackage.submodule2 import some_function ``` 注意:执行脚本时需确保当前环境支持顶层解析。通常可通过 `-m` 参数启动脚本来实现这一点。 --- #### 4. IDE 配置引起的入问题 某些集成开发环境中(如 PyCharm),默认将项目根目录设置为源码目录 (`source root`) ,这可能会干扰基于相对路径的入逻辑[^4]。针对这种情况可采取如下措施之一: - 将实际含源代码的子目录标记为 source root; - 修改运行配置中的 PYTHONPATH 参数以显式加入所需搜索位置; - 利用虚拟环境隔离依赖关系从而减少冲突可能性。 另外值得注意的是,即使调整了以上选项仍可能出现找不到特定的现象——此时应该确认该第三方扩展已安装至正确的解释器版本里并通过命令行工具 pip 进一步核实其状态。 --- ### 总结 综上所述,处理 Python模块入过程中出现的各种状况可以从以下几个方面入手:检查所使用的 API 是否恰当;排除被载入单元内部存在的缺陷;合理运用不同类型的引用形式以及优化编辑平台设定等等。每种情形都有对应的诊断手段和技术对策可供参考应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值