python 模块导入详解

忆阻器(二)——忆阻模拟器 除了真实的器件,我们也可以用运放和乘法器来搭忆阻模拟器。这节将介绍数学模型、matlab仿真及multisim仿真。 一、数学模型 忆阻分为磁控和荷控两种,这里介绍三次非线性磁控忆阻模型: {I=W(φ)VW(φ)=a+3bφ2dφdt=V \begin{cases} I=W(\varphi)V \\ W(\varphi)=a+3b \varphi ^2\\ \frac{d \varphi }{dt}=V \end{cases} ⎩⎪⎨⎪⎧​I=W(φ)VW(φ)=a+3bφ2dtdφ​=V​ 这里的WWW 阅读详情

python 模块导入详解

在写python代码时经常会导入一些内置模块、第三方模块或者自己目录下写的模块。模块可以通过绝对路径或相对路径导入,既可以导入一整个包,也可以导入某个模块,还可以导入模块中的某个特定对象(类,函数或变量等)。而在一些大型的工程中,如果不通过一定的方式管理好包的导入,则各文件之间的导入非常混乱,极易出错。对于该工程包的外部调用者来说,如果调用的路径太深或者太乱,都很不友好。

下面构造一个package目录,后续所有例子都根据该结构来进行解释和说明。
在这里插入图片描述

项目根目录下有两个包,package_1和package_2;package_1下有两个包package_1_1和package_1_2;package_2下有一个包package_2_1。

在module_1_1中有一个类Cls1_1;在module_1_1_1中有一个类Cls1_1_1;其它所有module同理;所有的init文件当前为空。

import运行机制

当import XX的时候

  • Python会首先从 sys.modules 路径中找是否有该模块。python 中所有加载到内存的模块都放在 sys.modules缓存 。如果加载了则只是将模块的名字加入到正在调用 import 的模块的 Local 名字空间中。
  • 如果sys.modules缓存中没找到,则搜索python的内置模块
  • 如果仍没有找到,则在sys.path列表定义的路径中找该模块,如果找到则加载到当前空间。sys.path下主要就是python设置的三方包安装的路径以及当前工作的路径。
>>>sys.path
['D:\\pycharm\\PyCharm Community Edition 2021.1.1\\plugins\\python-ce\\helpers\\pydev', 'D:\\pycharm\\PyCharm Community Edition 2021.1.1\\plugins\\python-ce\\helpers\\third_party\\thriftpy', 'D:\\pycharm\\PyCharm Community Edition 2021.1.1\\plugins\\python-ce\\helpers\\pydev', 'C:\\Users\\Administrator\\anaconda\\envs\\blog\\python38.zip', 'C:\\Users\\Administrator\\anaconda\\envs\\blog\\DLLs', 'C:\\Users\\Administrator\\anaconda\\envs\\blog\\lib', 'C:\\Users\\Administrator\\anaconda\\envs\\blog', 'C:\\Users\\Administrator\\anaconda\\envs\\blog\\lib\\site-packages', #第三方包安装路径
 'D:\\pycharmprojects', 
 'D:/pycharmprojects'##当前工作路径]

这里有一个值得注意的地方,就是pycharm 等部分IDE会自动添加当前的项目工作目录到sys.path中,如上面这个例子就是在pycharm中运行。而比如在控制台或者服务器上运行代码时,则不会自动添加,如:

(tensorflow) D:\>cd pycharmprojects\
(tensorflow) D:\pycharmprojects>python
    >>> import sys
    >>> import os
    >>> os.getcwd()
    'D:\\pycharmprojects'
    >>> import sys
    >>> sys.path
    ['', 'C:\\Users\\Administrator\\anaconda\\envs\\tensorflow\\python36.zip', 'C:\\Users\\Administrator\\anaconda\\envs\\tensorflow\\DLLs', 'C:\\Users\\Administrator\\anaconda\\envs\\tensorflow\\lib', 'C:\\Users\\Administrator\\anaconda\\envs\\tensorflow', 'C:\\Users\\Administrator\\anaconda\\envs\\tensorflow\\lib\\site-packages',#第三方包路径
     'C:\\Users\\Administrator\\anaconda\\envs\\tensorflow\\lib\\site-packages\\win32', 'C:\\Users\\Administrator\\anaconda\\envs\\tensorflow\\lib\\site-packages\\win32\\lib', 'C:\\Users\\Administrator\\anaconda\\envs\\tensorflow\\lib\\site-packages\\Pythonwin']

可以看到,在控制台中运行sys.path就没有当前的工作目录D:/pycharmprojects了;因此经常会出现在本地IDE运行代码时没有问题,推到服务器上运行时经常报错没有XX包,可能原因之一就是在服务器上没有添加当前项目根目录到sys.path中。

绝对导入

绝对导入和相对导入都有一个参考物,绝对导入的参照基准就是最顶层包的根目录;如module_2的顶层包为package_2;module_2_1虽然在package_2_1下面,但package_2_1是在package_2下面,因此module_2_1的顶层包仍为module_2_1。有了顶层包根目录的参考,则绝对导入的方式如下:

from XXX import yyy
#XXX为基于该包的根目录的路径,yyy是该路径下要导入的包、模块或者对象

举例:

例子1:在module_2.py中导入module_2_1或者module_2_1中的Cls2_1

from package_2.package_2_1 import module_2_1#module_2_1的根目录为package_2
#更进一步,导入模块中的类
from package_2.package_2_1.module_2_1 import Cls2_1

注意一般说的相对导入、绝对导入都是指包内导入。但这里的包一定是指最顶层的包,比如这里应为package_2而不是package_2_1;如果使用from package_2_1 import module_2_1导入,也能成功,但这里就是后面要说的相对导入(隐式)了,因为module_2.py和package_2_1在同一目录下。

例子2:在module_1_2中导入module_1_1

#绝对导入,module_1_1的顶层包根目录为package_1
from package_1.package_1_1 import module_1_1

例子3:在module_1_1中导入module_1_1_1

#module_1_1_1的顶层包根目录为package_1
>>>from package_1.package_1_1 import module_1_1#该方式没有问题

#该绝对导入的路径错误
>>>from package_1_1 import module_1_1
ModuleNotFoundError: No module named 'package_1_1'

注意和前面提到的同一个问题,虽然module_1_1和module_1_1_1都在包package_1_1下,但顶层包根目录是package_1,如果要使用绝对导入,必须从package_1开始。

相对导入

相对导入的参照位置为当前文件所在的目录。分为隐式相对导入和显示相对导入。

例子1:在module_1_1_1中导入module_1_1

import module1_1 # 隐式相对导入
from module_1_1 import Cls1_1# 隐式相对导入

from . import module1_1#显示相对导入,但这个在现在的python版本中会报错ImportError: attempted relative import with no known parent package;或许已经不支持.和..这类相对导入

例子2: 在module_1_1_1中导入module_1_2

from ..package_1_2 import module_1_2#..代表上级目录Package_1,但是该方式仍旧报错ImportError: attempted relative import with no known parent package;具体原因不确定是已经不支持还是怎么,查了很多都未解决。

因此,同一个包目录下可以使用隐式相对引用,跨目录最好直接都用绝对引用。

导入规范

一般在一个文件中,先导入内置模块,再导入第三方包模块,最后导入工程内自己写的模块。

举例:

#导入内置模块
import os 
import datetime

#导入第三方包
import keras
import pandas  as pd

#导入自己的模块
import package_1

总结

在 Python3.x 中,绝对导入是默认的导入形式,也是 PEP 8 推荐的导入形式,它相当直观,可以很明确的知道要导入的包或模块在哪里。且包的名称变化需要在导入的时候对应的修改。之后工程内部的导入尽量都是用绝对导入。

这里有一个问题,如果包的结构非常复杂,各类引用又要绝对引用,会让包导入的过程非常臃肿且难记,

举例:在package_1的外部想从package_1中的module_1_1中导入Cls1_1对象

from package_1.package_1_1.module_1_1 import Cls1_1

这种时候可以通过组织各package中的__init__文件来使导入更为方便,在python中当调用某包时,首先会运行其下面的init文件,如果在init中将该包下面的一些对象导入出来,在外部调用时就不用一层层调用了。

举例:

在package_1下的init文件中添加:

from package_1.package_1_1.module_1_1 import Cls1_1

那么在外部某模块中,如果想调用module_1_1中导入Cls1_1对象,则只需要

from package_1 import Cls1_1
2025年12月GESP真题及题解(C++一级): 小杨的爱心快递 阅读详情

相关推荐

基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现

本文详细介绍基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现。通过I2S接口直接传输PCM数据,避免SRC重采样,实现真正的HIFI级音质。涵盖硬件连接、软件架构、网络传输优化及实际音质对比,为音频爱好者提供高性价比的无损无线音频解决方案。

rnn9storyteller的博客 949

pycache怎么用_pyhton中__pycache__文件夹的作用

大多数人都是使用pycharm开发python项目,我们发现当编写了一个新工程,会在第一次运行后,工程根目录下生成了一个__pycache__文件夹,里面是和py文件同名的各种以.cpython-37.pyc结尾的文件。cpython代表的是c语言实现的Python解释器,-37代表的是python3.7版本。当然,由于每个人的python版本不同,会有所不同。要想理解__pycache__文件夹...

weixin_35910073的博客 1804

PFC中pb模型实战:从胶结参数设置到破坏模拟全流程解析

本文详细解析了PFC软件中平行胶结模型(PB模型)的实战应用全流程。从胶结参数(pb_kn, pb_ks, pb_ten等)的物理意义与精准赋值入手,深入探讨了模型构建、胶结施加以避免初始损伤的技巧,并系统介绍了破坏过程的监测、阈值判定方法以及高级可视化与常见问题诊断。旨在帮助岩土工程与颗粒材料研究者掌握从参数调试到破坏模拟的核心操作,提升数值模拟的准确性与效率。

php55的博客 1075

kail系列之初期的网络配置分析

分享,也是一种温习的过程,更是给自己在未来写下的笔记 ——杰 项目场景: 我们在第一次使用kail的时候,经常需要我们进行网络配置。网上的教程有很多,我们照着来就好,但是为什么要这样写,对于大多数的小白来说,依然茫然。 配置的过程: 打开kail, 键入:vim /etc/network/interfaces 然后在页面,我们可以修改配置。 #这里是动态地址的设置方式 auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp aut

weixin_44232687的博客 775

eNSP搭建基础网络

1、除5的环回地址固定以外,整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2、R1-R4每个路由器存在两个环回接口,用于模拟连接pc网段﹔地址也在192.168.1.0/24这个网络范围内 3、R1-R4上不能直接编写到达5.5.5.0/24的静态路由,但依然可以访问 4、全网可达,尽量减少每台路由器,路由表条目数量,避免环路出现5R4与R5间,正常100oA链路通信,故障时自动改为100M 全网使用192.168.1.0/24网段进行划分,尽量减少路由条目Pc端IP使用pHcP技

在月光下棕榈树的叶子在瑟瑟抖动 8469

LLM之RAG实战(五十四)| 复杂文档处理RAG框架:Ragflow

RAGFlow 是一种结合了检索增强(Retrieval-Augmented Generation,RAG)与流程控制(Flow)的人工智能技术架构。它通过检索外部知识库中的信息,结合自然语言生成技术,为用户提供更准确、更丰富的回答。同时,它还引入了流程控制机制,能够根据任务需求动态调整信息检索和生成的流程,从而更好地完成复杂的任务。RAGFlow 的核心优势在于将检索和生成相结合,打破了传统生成模型仅依赖内部参数进行文本生成的局限。

wshzd的博客 1067

【2023版】超详细Python+Pycharm安装保姆级教程,Python环境配置和使用指南,看完这一篇就够了

这两年被Python初学小白问到最多的问题就是,该用什么代码编辑工具?说实话,我个人是用JupyterNotebook最多,主要是经常做数据可视化,方便些。但对于初学者来说,PyCharm仍是不二的选择,甚至我建议你只用PyCharm.从当前所有主流PythonIDE来看,PyCharm是最适合做Python开发的,特别对新手而言,可以节省很多不必要的时间成本。那么具体如何使用呢?Python3.10.2解释器安装在PyCharm2021.1.3开发工具安装。......

Javachichi的博客 5万+

YOLOv11 结合 BiFormer 注意力:打造多场景高精度检测模型实战教程

注册BiFormer模块(若代码未自动注册)# 加载自定义配置的YOLOv11模型。

know_F0727的博客 253

Python pygame-ce(GUI编程)模块最完整教程(4/8)

调用一次被lru_cache装饰的函数后,返回值会被储存起来,如果第二次调用该函数的参数与先前调用的参数相同,那么就从储存的值中直接返回,大大提高了加载速度。pg.draw.rect方法中,必需的参数是surface, color, rect,表示进行矩形绘制的表面,矩形的颜色,矩形的位置。如果只进行矩形的碰撞,游戏角色中空白的部分的碰撞也会被检测到。(脏精灵支持的精灵组是LayeredDirty对象,而不是Group)脏精灵对象支持的方法和Sprite一样,此处不再赘述,下面介绍它的额外属性。

pythonzzy的博客 5356

【系统分析师】高分论文:论基于构件的软件开发(气象灾害影响评估系统)

本文以某手机气象灾害影响评估系统为例,探讨了基于构件技术的软件开发实践。通过分析开发中常见的功能模块重复问题,提出建立企业构件库、针对性选择构件和加强构件管理的解决方案。项目实施中成功复用登录模块等通用构件,并针对气象数据转换需求开发新构件,最终在8个月内高质量完成系统建设。文章总结了构件开发的三个关键点:构件库建设是基础、构件选择需精准、构件管理要规范。同时指出需注意全新需求开发、性能优化等问题,建议通过培训提升团队对构件的理解力。该案例证明构件技术能有效缩短周期、降低成本,为企业积累可复用的技术资产。

数据知道的博客 4253

Transformer-LSTM预测 | 基于Transformer-LSTM的多变量单步时间序列预测(Matlab)

Transformer-LSTM预测 | 基于Transformer-LSTM的多变量单步时间序列预测(Matlab)

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 192

Python pygame-ce(GUI编程)模块最完整教程(2/8)

get_mods方法获得的结果类似于event.mods,但是KEYDOWN或KEYUP只会在刚按下和刚松开按键时触发,而get_mods方法获得的是持续按下不松开的按键内容。Surface是渲染的文本表面,Rect是文本的大小,位于文字的原点。矩形对象的大小是表面的大小,位置(x, y)是文本原点的位置(也就是(0, 字体上升高度))。当用户按下某个按键时,会先打印一次"KEYDOWN",然后等待1000ms,再以200ms的时间间隔触发事件,打印多次"KEYDOWN",如果不能理解可以运行代码试一下。

pythonzzy的博客 7946

HFSS实战项目——基片集成波导(SIW)带通滤波器

设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好.

2401_87464239的博客 4897

python模块导入详解

目录 包和模块 模块导入 绝对导入 sys.modules sys.meta_path sys.path 相对导入 __init__.py相对导入 mian脚本中的相对导入 Reference 包和模块 我们可以在一个脚本中定义变量、函数和类,并添加逻辑,但是当某个项目具有复杂的逻辑时,我们希望把这些逻辑分解成不同的脚本,并以一定的合理的方式组织成层级结构,这种具有层级结构的包含脚本的文件夹就称为包。 模块通常指的是定义了变量、函数和类的脚本。但...

S_o_l_o_n的博客 8569

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

python导入模块语句_python 模块导入详解

本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句相关的概念。通常,导入模块都是使用如下语句:import...import... as ...from ... import...from ... import ... as ...一般情况下,使用以上语句导入模块已经够用的。但是在一些特殊场景中,可能还需要其他的导入方式。例如 Python 还提供了 __impor...

weixin_39878549的博客 3239

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python模块导入_python模块导入的细节详解

python模块导入细节本文主要介绍了关于python模块导入的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧官方手册:https://docs.python.org/3/tutorial/modules.html可执行文件和模块python源代码文件按照功能可以分为两种类型:用于执行的可执行程序文件不用与执行,仅用于被其它python源码文件导入的模块文件例如文件a.p...

weixin_39540934的博客 281

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python怎么导入文件-Python模块导入详解

定义模块:用来从逻辑上组织Python代码(变量、函数、类、逻辑)去实现一个功能。本质就是.py结尾的Python文件。包:用来从逻辑上组织模块的(可以放一堆模块在目录下)。本质就是一个目录(必须带有一个__init__.py文件)。导入模块导入单个:import 模块名导入多个:import 模块名1,模块名2导入模块中所有代码:from 模块名 import *import导入于from 模块...

weixin_37988176的博客 893

python怎么导入视频-Python模块导入详解

定义模块:用来从逻辑上组织Python代码(变量、函数、类、逻辑)去实现一个功能。本质就是.py结尾的Python文件。包:用来从逻辑上组织模块的(可以放一堆模块在目录下)。本质就是一个目录(必须带有一个__init__.py文件)。导入模块导入单个:import 模块名导入多个:import 模块名1,模块名2导入模块中所有代码:from 模块名 import *import导入于from 模块...

weixin_37988176的博客 1179

python中导入模块有哪些_关于python导入模块import与常见的模块详解

0.什么是python模块?干什么的用的?Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的module模块中。就这样的话,pthon提供的module还是海量的,所以除非使用某个模块里的某个函数时才会将其导入程序中。所以你使用某个函数前,要先知道他在哪个module里,然后将这个模块导入当前程...

weixin_39911998的博客 768

python中导入模块是用哪个关键字_关于python导入模块import与常见的模块详解

0.什么是python模块?干什么的用的?Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的module模块中。就这样的话,pthon提供的module还是海量的,所以除非使用某个模块里的某个函数时才会将其导入程序中。所以你使用某个函数前,要先知道他在哪个module里,然后将这个模块导入当前程...

weixin_39620273的博客 2219

python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解

0.什么是python模块?干什么的用的?Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的module模块中。就这样的话,pthon提供的module还是海量的,所以除非使用某个模块里的某个函数时才会将其导入程序中。所以你使用某个函数前,要先知道他在哪个module里,然后将这个模块导入当前程...

weixin_39760919的博客 2437

python中导入模块的方式_详解Python模块导入方法

python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起。python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。下面将具体介绍几种常用情况:(1)主程序与模块程序在同一目录下:如下面程序结构:`-- src|-- mod1.py`-- test1.py若在程序test1.py中导入模块mod1, 则直接使...

weixin_39538962的博客 256

python导入模块介绍_详解Python模块导入方法

python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起。python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。下面将具体介绍几种常用情况:(1)主程序与模块程序在同一目录下:如下面程序结构:`-- src|-- mod1.py`-- test1.py若在程序test1.py中导入模块mod1, 则直接使...

weixin_39620653的博客 98

Python之模块导入详解

Python 模块是组织代码的基本单元,通过将相关代码封装在 .py 文件中,提升代码的可维护性和重用性。模块的主要作用包括:代码组织与可维护性、代码重用、命名空间管理、性能优化、协作开发、安全隔离、发布与分发、调试与测试。

rufeike的博客 897

python使用import导入模块详解

在python程序中每一个独立的.py文件具有特定的功能,如果其功能需要被外界使用,该文件就构成了一个模块。 1.模块的定义规则: (1)模块中可以被使用的资源:类、函数、变量(全局)。 (2)模块的名称必须满足标识符命名规则。 2.模块的导入与使用: 1)全部导入:import 模块名称 模块资源使用格式: 模块名.类名/函数名/变量名 2)局部导入:...

托尼stark的博客 1630

python导入模块以及类_关于python导入模块import与常见的模块详解

0.什么是python模块?干什么的用的?Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的module模块中。就这样的话,pthon提供的module还是海量的,所以除非使用某个模块里的某个函数时才会将其导入程序中。所以你使用某个函数前,要先知道他在哪个module里,然后将这个模块导入当前程...

weixin_39901943的博客 242
上一篇: 对函数部分或全部参数进行类型检查
下一篇: python os 模块
千翻娃儿
博客等级 码龄8年 5粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值