python相对路径导包|模块

Python 导包技巧 Python 导包技巧 文章目录Python 导包技巧起因场景1场景2场景3感谢 起因 起初学 Go 语言的时候,对它的导包规则感到痛苦,——“那么麻烦干嘛呢!”。但最近接到一些新功能开发任务,于是 “啪嗒啪嗒” 写代码,结果更痛苦了。公司项目目录规划打一开始就不合理,以此为基础的 “繁荣发展” 导致更多混乱与麻烦。于是马上翻开《Python cookbook》解惑,有些心得,这里记之。 场景... 阅读详情
AI摘要

本文深入探讨Python中包和模块的导入机制,包括相对路径导入的问题与解决方案,以及如何在不同目录结构下正确导入模块。同时,文章还介绍了如何使用importlib.import_module函数进行动态导入,以及子包传递导入的具体实现。

https://www.cnblogs.com/f-ck-need-u/p/9961372.html#%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E5%AF%BC%E5%85%A5%E9%99%B7%E9%98%B1

例如 "from .. import m0718"或"from . import m0718_temp"会提示在"父包未知时尝试相关导入"

这是因为:python导包和导模块路径为sys.path和脚本所在目录,在python3.8中是先在脚本所在目录查找,查找不到时再从左至右在sys.path的目录列表中查找,打印sys.path的第一个''就表示脚本所在目录。形如"$ python3.8 m07182.py"这样的调用,Python解释器在cd的pwd目录中执行m07182.py模块,此时m07182.py是一个模块而不是一个包,没有包路径的概念,用户理解的上层目录".."或当前目录".",并不能被python解释器理解为"包的相对路径"。

解决方法:1、不使用".."或"."的相对路径表示,将要导入的模块或包的路径加到sys.path或放到sys.path的任何一个目录下;

2、形如"$ python3.8 -m ~/Files/pack/m07184.py"执行脚本文件,显式地带父目录或祖目录来执行一个模块,使python解释器获悉包路径,然后使用相对路径就可以被python解释器解析出绝对路径予以导入

3、具体原理以后再学习,这里先给出拙见

目录结构为

                      /home/haypin/Files/m0718.py                                        被调脚本

                      /home/haypin/Files/pack/m0718_temp.py               被调脚本

                      /home/haypin/Files/pack/m07182.py                          主调脚本

                      /home/haypin/Files/pack/m07184.py                          主调脚本

                      /home/haypin/Files/pack/subpack/m07185.py       被调脚本

可以看到,第一种方式cd 到主调脚本m07182.py所在目录~/Files/pack,print(__file__)只打印相对pwd目录下的文件名,print(__package__)则打印None,说明只把m07182.py当做模块而不是包,不是包就没有路径,不能用".."或"."表示父目录或当前目录,因为没法解析。

第二种方式cd到主调脚本和被调脚本共同的父目录或祖目录,然后以包的形式调用主调脚本模块,此时print(__file__)会打印出主调脚本的绝对路径,并不是相对于pwd的相对路径,print(__package__)打印"Files.pack"的包路径,"pack"是主调脚本模块的当前目录".","Files"是主调脚本模块的父目录"..",此时python解释器能将".."与"."按照包路径解析成对应的父目录与"当前目录",从而可以执行相对路径导包。

如果是通过包导入的模块中有相对路径导入,则在导包时也要显式提供父包".."与当前包"."

通过祖包"..."的相对路径导入也一样:

同理,cd到祖目录并以包的方式执行主调模块,从而使python解释器获悉"祖目录.父目录.当前目录"的包路径,就可以使用相对路径导入祖目录下的模块。

 

子包的传递导入:

https://blog.youkuaiyun.com/weixin_38256474/article/details/81228492

单独导入包(package):单独import某个包名称时,不会导入该包中所包含的所有子模块。
c.py导入同级目录B包的子包B1包的b2模块,执行b2模块的print_b2()方法:
c.py代码

import B
B.B1.b2.print_b2()
运行c.py,会报错。

解决办法:
B/__init__.py代码

from . import B1#其中的.表示当前目录
B/B1/__init__.py代码

from . import b2
此时,执行c.py,成功打印:b2。

 

20200725补充:

学习Django源码时看到了builtin的/usr/lib/python3.8/importlib/__init__.py中定义的导包函数import_module(name, package=None):

def import_module(name, package=None):
    """Import a module.

    The 'package' argument is required when performing a relative import. It
    specifies the package to use as the anchor point from which to resolve the
    relative import to an absolute import.
    

    """
    '''导入一个模块,当执行相对导入时参数'package'会被用到,它指定了被用来作为锚点的包,
    该锚点用来分解相对导入为绝对导入。也就是说相对导入仍然需要包名来确定一个相对
    sys.path的绝对路径来进行导入,本质上也是绝对路径导入。
    '''
    level = 0
    if name.startswith('.'):
        if not package:
            msg = ("the 'package' argument is required to perform a relative "
                   "import for {!r}")
            raise TypeError(msg.format(name))
        for character in name:
            if character != '.':
                break
            level += 1
    return _bootstrap._gcd_import(name[level:], package, level)

importlib.import_module(name, package)的使用,这里包名package与模块名name都是字符串,并且模块名要自己带个'.',其实就相当于"import package.name",没这个点还不行

'''a temp module m0809'''
from sys import path
path.append('/home/haypin/Files')
import importlib
m08092 = importlib.import_module('.m08092','pack.subpack')
print(m08092)

python3.8执行输出:
execute pack/__init__.py successed!
execute pack/subpack/__init__.py successed!
<module 'pack.subpack.m08092' from '/home/haypin/Files/pack/subpack/m08092.py'>
haypin@ubt:~/Files$

 

浅谈python的导包问题 昨天朋友问我,他python导包为什么提示导入失败,我一时语塞,发现并不是太清楚,于是今天就针对python导包做了下实验 简短截说,我认为python导包一共有3种情况,分别是: 要导的包与当前文件在同一层 要导的包在当前文件的底层(就是与当前文件夹同级的文件夹里) 要导的包在当前文件的上层 要导的包与当前文件在同一层 use.py source.py use.py表示包的调用方,so... 阅读详情

相关推荐

记录 | 在python中以相对路径导入包的方法

记录 | 在python中以相对路径导入包的方法

极智视界 809

关于吴恩达机器学习课程C1_W2_Lab03的报错

个人感觉是路径方面的问题 ,但是即使使用了如去掉“./”的方法但是仍然无法解决。这是将下载的文件复制过来之后的目录,不知道是否存在问题。希望有大佬能提供一些帮助!在运行代码的时候多次报错,如下。

2301_78001143的博客 853

python相对路径导包与绝对路径导包的正确方式

python导包的难题,今天解决了,相对路径导包和绝对路径导包,均可以!这里面的水可深了(爬虫/数据分析),【全748集】字节大佬终于把Python做成了漫画书,通俗易懂,2024最新内部版,学完即就业!,2024版-零基础玩转Python Django5项目实战-学完可就业,Vitual Box安装Centos Stream9,Python爱心代码(附源码),新版C#从入门到精通全套视频教程(180集全),上分利器?用Python自动化脚本训练AI玩王者荣耀,秀得我头皮发麻,轻松爆打本地人!

拥抱具身智能,昇腾Ascend C 1552

在学习吴恩达机器学习课程中遇到的一些问题

这一切一切的原因可能都是因为我们使用的是jupyter notebook,而教程里使用的是jupyter lab,在我更换了jupyter lab运行这些代码之后,就没有这么些麻烦事了可以直接运行如图:jupyter lab。

ttyykx的博客 4664

当 AI + 可视化融入消防:开启智能消防新时代

总结来说,AI + 可视化技术融入消防,开启了智能消防新时代。它以精准预警、高效救援和全面资源管理,革新消防工作方式。从前期规划到系统搭建,再到后期运维,每个环节都为提升消防能力奠定基础。尽管面临技术成本、数据安全和人员适应等挑战,但随着技术发展和应用推广,这些问题将逐步解决。相信在 AI + 可视化助力下,消防领域将不断进步,为人们创造更安全生活环境,有效抵御火灾威胁。

2401_87844374的博客 1220

ACM算法模板 · 一些常用的算法模板-模板合集(打比赛专用)

萌新常用的都在这了,本萌新的模板集。

张天枭の博客 5万+

吴恩达机器学习问题

C1_W2_Lab02_Multiple_Variable_Soln中的。出现了图片中的问题,小白求救!

Leo_zhang1995的博客 644

Coze知识库搭建:智能化管理与高效检索实践

知识管理系统是现代企业信息资产管理的核心基础设施,其核心原理是通过结构化存储和智能检索技术实现知识的快速流转。在技术实现上,基于NLP的语义理解引擎和知识图谱构建是关键,能够显著提升检索准确率和知识关联性。以Coze平台为例,其针对中文场景优化的分词算法和多模态处理能力,可有效解决技术文档管理中的术语识别和格式兼容问题。这类系统在开发团队知识沉淀、新员工培训等场景中价值显著,特别是当集成RBAC权限模型和自动化备份策略后,既能保障信息安全,又能实现持续的知识迭代。通过合理配置同义词扩展和权重调整,可使搜索命

weixin_29041195的博客 262

吴恩达机器学习记录W1

纯粹个人记录

qq_41102385的博客 1007

分析方法—temporal receptive field(TRF)

总结来说,时间感受野其实就是一个 filter!课程中的描述—.(使用时间感受野与刺激进行卷积来描述)时间感受野一般是听觉计算中使用的,在视觉中,有另一种分析叫做空间感受野(spatial receptive fields)。回归权重(Regression weights)是指在回归分析中用于估计自变量与因变量之间关系的权重或系数。回归分析是一种统计方法,用于建立自变量与因变量之间的关联模型,并通过拟合数据来估计模型中的参数。在简单线性回归中,只有一个自变量与一个因变量之间的关系被建模。

m0_51474171的博客 1602

在Android中实现SIM卡的读写操作

在上述代码中,我们创建了一个PhoneStateListener的实例,并重写了onSimStateChanged方法来处理SIM卡状态改变的事件。然后,我们通过调用telephonyManager的listen方法注册了这个监听器,并指定了要监听的事件类型为SIM卡状态的改变。在上述代码中,我们调用telephonyManager的sendUssdRequest方法来发送USSD命令,并通过TelephonyManager.UssdResponseCallback来处理USSD响应和发送失败的情况。

2301_79326510的博客 923

pyuthon 导包报错

在不同模块内调用上面模块,此时报错,找不到对应模块。相对路径导包成功,相同模块内相对路径调用。python3.7导包报错 找不到模块。

weixin_52529845的博客 80

吉林大学数据库期末考试试卷讲解

给出几套期末真题及解析,给出复习建议。

一杯水果茶!足矣~ 3141

python导入自定义的包

python导入自定义的包

oneself的博客 2549

8.DJI-PSDK:一站式项目功能开发总结(空中气象站项目/激光甲烷检测项目)

本文将以一篇文章的幅度快速完成: 项目一:空中气象站项目; 项目二:激光甲烷项目; 项目所使用的PSDK来源于第0章节末尾的百度网盘;解压:Payload-SDK-3.8.zip代码所在目录:双击打开: 修改打印串口和相关波特率,我们修改如下: 进行相关编译选项配置如下: :

哒宰的博客 294

Qt代码-软件商店

ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString()));

寒寒豆豆软件公司的博客 111

python之导包(库的所在位置,导包原则)

记录一下python导包的规则。

weixin_45272371的博客 6279

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

找不到key的 报错_Python导入运行的当前模块报错

引言今天遇到了一个奇怪的现象,简单举个栗子:文件结构如下:其中tt.py文件中定义了一个方法:def tt(): print('tt')我现在要在test.py中使用tt(), 代码如下:from test.tt import tt​if __name__ == '__main__': tt()以上导入模块是编译器自动导入的,运行后直接报错:说没有找到这个模块,然后我将导入换成相对路径可以看到编译...

weixin_42128393的博客 246

精雕软件(JDpaint) 5.5 绿色版

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

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

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

Python from import导包ModuleNotFoundError No module named,找不到模块问题

在学习Flask框架的蓝图时,遇到导包时用到了`from.模块import对象`,然后试了试直接import会报错,直接告诉我找不到模块,发现问题以此记录。

李白 1999

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【路径问题】

路径问题

骨子里对自己的信任,决定未来的成败! 267

Python相对路径问题的理解

对于相对路径import文件的理解

qq_41641544的博客 199

Python导入运行的当前模块报错

引言 今天遇到了一个奇怪的现象,简单举个栗子: 文件结构如下: 其中tt.py文件中定义了一个方法: def tt(): print('tt') 我现在要在test.py中使用tt(), 代码如下: from test.tt import tt ​ if __name__ == '__main__': tt() 以上导入模块是编译器自动导入的,运行后直接报错:...

烟草的香味的博客 274

关于python中的import、from、循环引用等相关问题

摘要 关于导包问题,很少有人去在意它,但是它一直都在哪,也许出现了,百度一下就解决了,但是始终不理解。 知识不存在不求甚解,授人鱼不如渔。 不要拿pycharm中是否有导包提示来考虑此类问题 不讨论内置包及第三方包 不讨论通过sys.path.insert()方法添加进去的包 先说 from xx import yy 和import xx的区别: from:程序进行的修改不会影响到被导入的原...

rusi__的博客 705

[python学习]--使用相对路径导入包

在Python 2中,相对导入是隐式地相对于当前文件的,而在Python 3中,它们是相对于当前模块的。因此,在Python 3中,即使你的脚本是在包的外部运行的,相对导入也会相对于包进行解析。然而,在某些情况下,相对导入可能是有用的,特别是当你需要避免硬编码包名或当包结构非常复杂时。在Python中,使用相对路径导入包或模块通常是在包内部进行的,以便在不指定完整包路径的情况下引用同一包内的其他模块。但是,需要注意的是,相对导入在包的外部(即不在包内部)通常是不被推荐的,因为它们可能会导致导入错误和混淆。

jingling122的博客 1062

python文件读取&导包的绝对路径、相对路径

本文主要讲述了文件读取的绝对路径和相对路径;导包的绝对路径和相对路径,以及当前工作路径和绝对路径的区别(`os.getcwd(),os.pah.abspath(__file__)`)

qq_34229228的博客 1万+

python 导包相对路径与项目打包wheel

今天想将自己的代码打包成一个wheel文件,然后pip安装一键搞定的事情。遇到了相对导包的问题。要彻底地解决这个问题需要重新认识一下python关于模块与包的相关概念。 一、什么是模块? 一个py文件就是一个模块 二、什么是包: 多个模块放在一个目录下,并且存在一个__init__.py文件的目录就是一个模块。 首先构建一个测试的项目,目录结构如下: 代码如下: # hello.__init__.py print('__package__={} | __file__={} | __name__={} '.

sheqianweilong的博客 1595
上一篇: python类实例方法的形参self并未做类型限定,只会在运行时做类型检查
下一篇: python模块相互导入时报错AttributeError: partially initialized module module-name has no attribute-name most
HayPinF
博客等级 码龄9年 175粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值