python学习之路--包的导入

Python学习之Part28.包的相对导入和绝对导入 1.包的绝对导入 已知我们有如下文件结构: 当我们在pycharm中新建一个工程时,当前的工程路径就会作为我们当前的根目录(sys,path[0] 是当前文件所在的目录,sys.path[1]就是当前工程所在的目录) 以根目录为起点,一级一级导入包的方式是绝对导入 绝对导入的优点是:  不管是在包内部导入还是在包外部导入,只要导入了就可以使用,很直观; 缺点是:  不能随意挪动包的位置,包的路径... 阅读详情

 luffy最近在用python做一个项目. 一开始只针对各个功能进行实现, 没有什么问题. 后来出现某个模块需要调用另外一个模块的方法, 这时候就出现问题了, 频繁报错:
ValueError: attempted relative import beyond top-level package
假设项目的目录结构是这样的:
Fruit文件夹下有A文件夹, A文件夹下有B, C文件夹

Fruit|
	f.py			
	A|
 		__init__.py
		a.py		
		B|
			__init__.py
			b.py		
		C|
			__init.py
			c.py		

原因分析

有三个主要原因, 导致Python比较容易出现导入包的错误, 不像java或者c/c++, 很少出现导入包或者库的问题;

  1. py文件允许单独执行, 也就是说你可以单独以 f.py, a.py或者b.py作为入口来执行, 但是此文件会作为main模块, 就是top-level package.

  2. 在终端执行py文件的时候, 会将终端当前的路径cur_path作为参数传递给python程序, 在python程序中的所有相对路径代码./ ../ .../都是基于cur_path的(可以理解为进程所在路径为基准).

  3. python导入包的时候, 会从程序入口所在py文件的当前目录下进行查找, 如果找不到, 会从python环境变量列表里面找(实际上是遍历sys.path, 你可以print(sys.path)查看这些路径)

出现错误的情况千变万化, 这里不去做分析, 只提供靠谱的做法, 如下.

方式1 固定包名结构, 固定程序入口

 此种方式结构最清晰, 容易理解. 有以下几点要求.

  1. 确定程序结构, 在任意模块中调用其他模块, 严格遵守包的层次结构;
  2. 执行py文件的时候
#F/A/a.py
def a():
    pass
#F/A/B/b.py
def b():
    pass

在c.py中导入b模块, 严格按照包层次命名: import A.B.b

#F/A/C/c.py
import A.B.b as b 
def c():
    print('This is {}, I imported {}'.format(__name__, b.__name__))
#F/f.py
#F/f.py
import A.a as a 
import A.B.b as b
import A.C.c as c

print('This is {}, I imported {}, {} and {}'.format(__name__, a.__name__, b.__name__, c.__name__))
c.c()

 在F下执行python f.py, 得到输出结果

This is __main__, I imported A.a, A.B.b and A.C.c
This is A.C.c, I imported A.B.b

如果要单独执行包内的某个模块, 比如c.py, 在F目录下, python -m A.C.c即可

方式2 设置环境变量

 环境变量PYTHONPATH, 如果你把你需要调用的包所在路径'home/username/F/A'写入PYTHONPATH, 那么python解释器会将其添加的’sys.path’的开头, 也就是说会首先从home/username/F/A查找包.
设置PYTHONPATH:
 那么, 如果你要在c.py中调用b.py, 你需要把包B所在路径添加到环境变量, 有永久和临时两种方式, 这里只介绍临时.

方法一:命令窗口添加路径

export PYTHONPATH=$PYTHONPATH:/home/username/F

 注意:此方法只在当前命令窗口生效,即如果打开一个新的Terminal 窗口,定位到当前目录, 打印PYTHONPATH 是没有刚才加入的路径的.

方法二:在c.py 中添加:

#F/A/C/c.py
PROJECT_PATH = "/home/ubuntu/F/"
import sys
sys.path.append(PROJECT_PATH)
print(sys.path)
import A.B.b as b 
def c():
    print('This is {}, I imported {}'.format(__name__, b.__name__))
c()

OK, 在任意位置运行c.py文件, 都可以得到正确的结果,

This is __main__, I imported A.B.b

方式3 采用相对路径(强烈不推荐)

 这种方式就是产生混乱的源泉, 所以建议不要使用.
有时候临时需要单独调试某个模块, 又不想切换到顶级目录, 便使用这种. 比如还是在c.py中调用b模块, 代码如下:

#F/A/C/c.py
import sys
sys.path.append('../')
import B.b as b 

def c():
    print('This is {}, I imported {}'.format(__name__, b.__name__))

c()

将终端cd到c.py所在路径, 然后执行python c.py, OK, 可以得到正确的结果.!!!但是, 一旦在其他目录执行c.py, 或者在顶级目录执行程序入口, 用到了c模块, 就会出错. 比如在c的上一级目录A下执行python C/c.py

Traceback (most recent call last):
  File "C/c.py", line 4, in <module>
    import B.b as b 
ModuleNotFoundError: No module named 'B'

参考博客

python引入模块报错ValueError: attempted relative import beyond top-level package
Python 相对导入
python3文档
Python中的PYTHONPATH环境变量

火山引擎之火山方舟知识库+OpenWebUI,搭建独属于自己的AI智能客服 创建接入点,接入点名称可按个人需求而定,比如Doubao-1.5-pro-32k,在添加模型选择Doubao-1.5-pro-32k,点击确定(PS:有些模型不支持知识库,若发现后续无法选择,请重新创建推理接入点。选择应用广场,创建零代码应用,在创建好的应用设置内编辑相关信息,并选择推理接入点,即先前建好的推理接入点;此处的模型名称是火山的模型ID名称,可在OpenWebUI设置-模型 中修改名称。至此所需的apikey和模型ID和请求的api地址(可选配置,非本文重点参数)。进入火山官网,注册账号。 阅读详情

相关推荐

避坑指南:在Ubuntu 22.04上配置UR5e与ROS2 Humble真机通信的完整流程

本文详细介绍了在Ubuntu 22.04上配置UR5e机械臂与ROS2 Humble真机通信的完整流程,包括环境准备、网络配置、URCap安装、ROS2驱动部署及控制器状态验证等关键步骤。特别针对常见问题如网络连接失败、驱动启动错误等提供了实用解决方案,帮助工程师高效完成UR5e与ROS2的集成工作。

weixin_30790841的博客 463

基于python控制KLayout

基于python控制KLayout

SemiconductorPhysics 6979

固定翼飞行器建模(二)——MATLAB/Simulink建模、配平及线性化

MATLAB/Simulink固定翼建模、配平及线性化。

2302_80148937的博客 1万+

python中的 __init__.py

Python 定义了两种类型的包,常规包和命名空间包。常规包是传统的包,因为它们存在于 Python 3.2 和更早的版本中。一个常规包通常被实现为一个包含__init__.py 文件的目录。当一个常规包被导入时,这个__init__.py文件被隐式执行,它所定义的对象被绑定到包的名字空间中。 这是Python官方文档中对__init__.py文件的描述,其实它的意思很简单,就是说Python文件都是按照目录当作不同的模块来组织的,这个目录被认为是Python包目录,Python会通过搜索该目录下的..

关宅 811

systrace分析 之 问题初步定位

如下surfaceflinger空缺点,上面对应的bufferTX 中有buffer,但VSYNC-SF 过来后,SurfaceFlinger却没有去取,检查测试app “android.settings”, 也没有GPU completion 时间长的问题,所以该部分可以请SurfaceFlinger的owner 进一步确认为何不取buffer。. GPU拿的是acquireFence HWC拿的是releaseFence, GPU是绘图,HWC是合成显示,这两个是互相等待的关系,

yangzex的专栏 3195

YOLOv8/v9实战:从零搭建智慧零售货架管理系统(附完整可运行代码)

摘要:本文基于YOLOv8/v9目标检测算法,详细讲解智慧零售货架管理系统的开发流程,解决传统人工巡检效率低、漏检率高的问题。内容涵盖环境配置、商品检测、陈列分析、价格标签验证等核心功能实现,提供可运行代码及零售专用数据集训练方法。系统支持实时货架状态监控、缺货预警与数据分析,帮助零售企业降低运营成本30%以上。 关键词:YOLOv8、YOLOv9、智慧零售、货架管理、商品检测 标签:YOLOv8、YOLOv9、目标检测、零售AI、Python

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1309

python引入其他py文件(模块)

以 a.py 想引入 b.py 为例: 1、b.py 与 a.py 在同一目录下: import b 2、b.py 在某文件夹内,目录结构类似如下: filename1 ----filename2 --------b.py a.py 解决方法:添加 init.py 文件 目录结构变为: filename1 ----__init__.py ----filename2 --------__init__.py --------b.py a.py 然后就可以在 a.py 通过import引入了: import

zero_ling 1万+

SAP-ABAP:FI财务会计模块常用BAPI及核心用途实例说明

SAP FI模块的BAPI覆盖了从主数据管理、凭证过账到财务关账的全流程操作,是系统集成与自动化的重要工具。实际应用中需结合业务场景选择合适的BAPI,并严格遵循事务控制与校验规则。如需扩展功能,可通过BAdI或用户出口增强标准逻辑。

baidu_35680696的博客 1601

【Python】import模块的多种操作

Python导入模块的多种操作,实在是太棒了!!!还介绍了importlib 和 __all__魔法函数

苟日新,日日新,又日新!!! 1330

华为OD机试双机位C卷:日志排序 (Py/C/C++/Java/Js/Go)

华为OD机试双机C卷真题【日志排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-日志排序。

qq_45776114的博客 1754

关务管理项目专题:SAP 与关衡关务系统的进出口报关业务集成(1)需求和方案整理

一个拥有进出口业务的企业就需要报关,而关务系统就是用来辅助企业日常进出口报关,同时数字化、合规化报关业务的有效工具。本章属于关务管理项目专题系列,以 SAP 与关衡关务系统的进出口报关业务集成为实例,详细讲解报关业务的需求和方案整理。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 2076

一文讲清Python的7大学习路线(建议收藏)

现如今铺天盖地都是来自学习Python的勇士,Python这个编程语言中最友好的语言早已不是高不可攀的状态了。无论是业余爱好,还是专职求学,学习Python的朋友都在依靠着自己的方法,勤勤恳恳的学习着,但是学习有方向,入门有方法,进阶更是需要正确的学习方式。Python学习范围很广,相应的,应用范围也很广,作为一名Python学习者,该如何正确找到适合自己的进阶方向呢?

qq_46094651的博客 1790

【教程4>第6章>第26节】基于FPGA的MMSE信道估计与均衡系统实现与整体测试,并对比LS信道估计

通过前面几个章节的学习,我们完成了MMSE信道估计和均衡系统。为了进一步验证MMSE信道估计的性能,我们在系统的最后,增加一个信道估计误差计算程序。由于MMSE信道估计,其主要优势在SNR较小时提现,因此测试对比时,我们在testbench中,将SNR设置为2db。然后m值,我们不考虑一个固定值,而是一直累加,直到所设置的仿真时间结束。通过对比可以看到,MMSE信道估计性能优于LS信道估计。这样方便FPGA中的误差计算。

FPGA/MATLAB学习教程/源码/项目合作开发 1599

python学习:包导入教程

导入模块时除了使用模块名进行导入,还可以使用目录名进行导入。

Python热爱者的博客 7639

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Python学习记录之 模块和包的导入

from 包名 import *是导入包内的全部文件,但有可能因为路径原因导致程序找不到导入的模块,这时候需要在__init__.py中加入__all__=['模块名',…](依旧是双下划线)from 包名 import 模块名 从包里导入某个模块,这里的包是一个带有__init__.py文件(注意是双下划线)的文件夹,同样也可以加as。import 模块名 (as +自定义的一个较短的模块名)这种适用于模块是同个目录下的.py文件的情况。对于同个目录下的文件导入也可以用from .import 模块名。

QqAqQ_1的博客 162

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Python 深度学习导入的一些包的说明

Python 深度学习导入的一些包的说明

engchina的专栏 432

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【从零学习python 】38.Python包的使用及导入方式

本文介绍了Python中包的概念和使用方法。通过创建包,可以将有联系的模块组织在一起,提高代码的可维护性。文章详细讲解了四种导入包的方式:直接导入指定模块、使用from-import方式导入指定模块、在__init__.py文件中导入指定模块、以及使用__init__.py结合__all__属性导入包中的所有模块。同时还介绍了__init__.py文件的作用和使用场景。通过合理利用包和模块的导入,可以更好地管理和组织Python项目的代码结构。

全栈若城,专注知识分享 2659

Python学习17:模块和包的导入

笔者:风起怨江南出处:https://blog.youkuaiyun.com/JackMengJin笔者原创,文章转载需注明,如果喜欢请点赞+关注,感谢支持! 目录 Python的模块导入 1.什么是模块?什么是包? 1.1 Python 模块(Module) 1.2 什么是包? 1.3模块分类 1.4内置模块 1.5 第三方模块 1.6 为什么包里必须有__init__? 2. 模块导入 2.1导入模块的方法 2.2导入内置模块 2.3导入第三方模块 2.4导入自定义模...

风起怨江南 774

python导入自己写的包_python中模块和包的零基础学习

一、模块、包1.模块:一个包含所有你定义的函数和变量的文件,其后缀名是 .py ,一个.py文件就是一个模块模块实质上就是一个python文件。它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文...

weixin_39714763的博客 237

Python学习 day05(异常、模块导入、包)

【代码】Python学习 day05(异常)

丿罗小黑的博客 576

Python 学习记录(五)Pycharm导入包

Pycharm社区版2021.1.2社区版导入包 1.路径 File菜单下的Settings……菜单 打开菜单如下: Appearance是界面风格设置,这默认是Darcula,灰色主色调。 2.添加引用包 点击左边的Project:PythonProject项目,默认名称是这个。 点击加号,弹出新窗口: 输入需要导入的包,比如Numpy: 里面具有很多包含这个名字的包,选择numpy包,点击Install Package按钮,开始安装。 安装完整之后左下角有一个状态

soderayer的博客 3197

fileinputstream导入包里面的文件_Python学习教你在几分钟内构建一个Python包

构建包的过程有些复杂,但从长远来看是值得的,尤其是可以创建属于自己的Python包。本文的目的是通过对构建一个新发行包的案例研究,让您了解需要构建什么以及如何构建python包的基础知识。开始首先,您肯定需要设置一个或多个内容,以便了解如何构建python包。因此,需要的东西的如下:IDE (Vs Code)Python 3构建Python包本文中构建的标称为b_dist。b_dist是一个分布包...

weixin_34261380的博客 163

2024年Python最全【Python学习教程】Python模块和包_python 一个新包怎么学习(2),如何搞定面试官

到目前为止,读者已经掌握了导入Python标准库并使用其成员(主要是函数)的方法,接下来要解决的问题是,怎样自定义一个模块呢?前面章节中讲过,Python 模块就是 Python 程序,换句话说,只要是 Python 程序,都可以作为模块导入。name = "Python教程"def say():print("人生苦短,我学Python!")可以看到,我们在 demo.py 文件中放置了变量(name 和 add)、函数( say() )以及一个 Clanguage 类,该文件就可以作为一个模板。

2401_84139049的博客 1150

python学习笔记:模块与包的导入与使用

模块与包 导入与使用模块 格式: # 方式1: ## 导入 import ModelName # 模块名即为py文件名 .... ## 调用模块 ModelNmae.函数名(参数列表) # 函数 ModelName.变量名 # 变量 ModelNmae.类名 # 类 # 方式2 ## 导入 from ModelName import 变量|函数|类|* # 同时导入此模块中的多个内容时用逗号分割,若为星号,则表示引入模块中的所有内容 ## 调用模块 ### 此种导入方式在调用模块内容时可不必再

qishengmoming的博客 274

python添加包路径_Python 学习 第13篇:模块搜索路径和包导入

在导入自定义的模块时,除了指定模块名之外,也需要指定目录,由于Python把目录称作包,因此,这类导入被称为包导入。包导入把计算机上的目录变成Python的命名空间,而目录中所包含的子目录和模块文件则对应命名空间中的属性。Python已经导入的模块保存在一个内置的sys.modules字典中,以便记录哪些模块已经记录了。一,模块搜索路径导入过程首先需要定位导入文件的位置,也就是,告诉Python到...

weixin_39534759的博客 429

py导入包异常跳出_马克的Python学习笔记#模块和包

把模块按层次结构组织成包模块和包是任何大型项目的核心,就连Python安装程序它本身也是一个包。创建一个软件包结构是非常简单的,我们只要把代码按照我们所希望的方式在文件系统上进行组织并且确保每个目录中都定义了一个__init__.py文件就好:graphics/ __init__.py primitive/ __init__.py line.py ...

weixin_34060672的博客 143
上一篇: python3基础之--字符编码解码
下一篇: ubuntu18.04安装docker最新版
LuffysMan
博客等级 码龄11年 22粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值