python package module import 完全总结

ros安装 catkin_make失败 ImportError: “from catkin_pkg.package import parse_package“ failed: No module na ros安装 catkin_make失败 ImportError: “from catkin_pkg.package import parse_package” failed: No module named ‘catkin_pkg’ 在ros安装时,运行到建立工作空间,然后编译catkin_make出错。 情况一:如果是你错误使用了Python3版本,那么就将编译命令由catkin_make改为 catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python2 参考链接1 阅读详情
总结这个python中 package以及module的导入,是遵循下面的文档结构进行的:
sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

. 
├── effects 
│   ├── echo.py 
│   ├── __init__.py 
│   ├── reverse.py 
│   ├── surround.py 
├── filters 
│   ├── equalizer.py 
│   ├── __init__.py 
│   ├── karaoke.py 
│   ├── vocoder.py 
├── formats 
│   ├── aiffread.py 
│   ├── aiffwrite.py 
│   ├── auread.py 
│   ├── auwrite.py 
│   ├── __init__.py 
│   ├── wavread.py 
│   ├── wavwrite.py 
├── __init__.py 
└── sound.py 


1.导入子目录的模块
这里导入子目录的某块,要保证子目录也是一个package (一个软件包), 如果一个目录要想成为一个 package 的话,那个这个目录中必须包含 __init__.py 这个文件,最简单的就让这个文件为空就可以了。

加入当前在sound这个文件夹中,包含一个叫sound.py的文件, 如果在sound.py 中想要导入 子目录 filters 中的模块,那么filters必须要保证是一个 package , 也就是要有 __init__.py这个文件。
然后可以使用目录 点号进行导入:
from filters import equalizer
from filters.equalizer import fun
如果在sound文件夹外面:
from sound.filter import equalizer
from sound.filter.equalizer import fun

在sound.py中导入的代码:
  1. import os  
  2. print 'current file:'  
  3. print os.path.realpath(__file__)  
  4.   
  5. print 'working dir:'  
  6. print os.getcwd()  
  7.   
  8. from filters import equalizer  
  9. equalizer.fun()  
在sound文件夹外,加入有一个文件叫main.py:
  1. from sound.filters import equalizer  
  2. equalizer.fun()  


2 . from module import *
如果想使用 from module import *, 那么必须保证这个module中定义了  __init__.py这个文件,并且,__init__.py文件中定义了 __all__ = [] 这个变量。
如果没有定义 __all__这个变量,那个from module import * 能够工作,但是不能导入这个package 中的所有的module,只能导入在 __init__.py 中声明的变量,以及已经通过 路径导入的模块,例如:
from filters import equalizer
from filters import *
这个时候,只能通过 from filters import * 导入  __init__.py 中声明的变量和已经导入了的equalizer

如果没有使用 __all__ 定义 from module import * 需要导入的模块,那么默认的什么都不导入,如果你想使用某个模块就会报错:

  • import
     os  
  • print 'current file:'  
  • print os.path.realpath(__file__)  
  •   
  • print 'working dir:'  
  • print os.getcwd()  
  •   
  • from filters import *  
  • print type(vocoder) 

    然后运行 python sound/sound.py, 得到以下的运行结果:
    songwei@songwei-ThinkPad-T410:~/WeiSONG/python/sound$ python sound.py  
    current file: 
    /home/songwei/WeiSONG/python/sound/sound.py 
    working dir: 
    /home/songwei/WeiSONG/python/sound 
    Traceback (most recent call last): 
      File "sound.py", line 9, in <module> 
        print type(vocoder) 
    NameError: name 'vocoder' is not defined 


3. 子模块间的相互导入
如果在filters这个package的模块中需要使用这个package兄弟package的模块,那么可以使用相对路径导入。
对于文件sound/filters/equalizer.py 来说,如果要导入兄弟package的模块,那么可以这样使用:
from . import vocoder 
from .. import formats 
from ..effects import surround 

但是,这是要保证这个模块不是入口文件,只是作为被导入的模块才可以以这样使用。并且,导入这个模块的文件要在sound这个文件夹之外,也就是不能在sound文件夹内,例如:
在main.py中:
from sound.filters import equalizer 
equalizer.fun()

如果是在sound/sound.py中导入equalizer.py,那么这样使用就会出错,因为sound/sound.py在导入 equalizer.py的时候,当前目录就不能当作package了,因为sound.py就运行在当前目录,这样在使用 .. 进入上一级package的时候,就会报错。“ValueError: Attempted relative import beyond toplevel package”

如果在sound/sound.py中导入equalizer:
import os 
print 'current file:' 
print os.path.realpath(__file__) 

print 'working dir:' 
print os.getcwd() 

from filte rs import equalizer 

这样的导入,当前文件 sound/sound.py 作为入口文件, 入口文件总是“__main__ ”,但是当使用sound.py作为入口文件的时候,就不能把sound这个文件夹作为一个完整的package来对待,因为你的入口文件在这个包的里面。 所以在equalizer.py 中进行相对导入的时候,使用 .. 运算符进入上一层的package, 然后发现入口文件就在上一层,所以不会把上一层当作一个package, 这样就会出现 下面这种错误。

ValueError: Attempted relative import beyond toplevel package


python 中只能在package中使用相对导入,不能在用户的应用程序中使用相对导入,因为不论是相对导入还是绝对导入,都是相当于当前模块来说的,对于用户的主应用程序,也就是入口文件,模块名总是为“ __main__ ”, 所以用户的应用程序必须使用绝对导入,而package中的导入可以使用相对导入。

在这里,相对导入 ., .., 应该理解为在:
. : 在当前的package中进行查找
.. : 在上一层的package中进行查找
不能理解为在当前目录中查找,也不能理解为在上一层目录中查找。

其他例子:

目录树

case2/
├── cat
│   ├── __init__.py
│   ├── cat.py
│   └── cat.pyc
├── dog
│   ├── __init__.py
│   └── dog.py
├── __init__.py
└── main.py 

代码

		
   
   
   
   
   
   
   
   
   
   
# case2/cat/cat.py 
from .. import dog 
# case2/main.py 
import cat.cat

执行

# python case2/main.py 

ValueError: Attempted relative import beyond toplevel package

错误原因

这里的 case2 是一个包,但当你直接执行 main.py 的时候,就没有把完整的 case2 当作一个包来处理了,可想而知,下层的 cat.py 自然找不到上层包了。即想要相对导入成功,必须让下层的被导入对象是上层包或上层包内的对象。




4. 模块导入,工作目录的变化
使用import 以及from module import * 的时候,会将import进来的变量或者函数添加到当前的命名空间,也就是说from module import * 改变了原来被导入模块的变量的工作空间,将它们添加到当前的命名空间了。
例如: from sound.filters import equalizer 
把equalizer的变量添加到当前的命名空间,这样,即使是在equalizer.py代码中打印当前的工作目录,也不是equalizer.py文件所在的工作目录了。

在 main.py:
from sound.filters import equalizer 
equalizer.fun() 

运行结果:
songwei@songwei-ThinkPad-T410:~/WeiSONG/python$ python main.py  
current file: 
/home/songwei/WeiSONG/python/sound/filters/equalizer.pyc 
working dir: 
/home/songwei/WeiSONG/python 
in filters/equalizer.py 
current file: 
/home/songwei/WeiSONG/python/sound/filters/vocoder.pyc 
working dir: 
/home/songwei/WeiSONG/python 
current file: 
/home/songwei/WeiSONG/python/sound/effects/surround.pyc 
working dir: 
/home/songwei/WeiSONG/python 
in equalizer 

这里每个显示的“current file” 都是被导入的文件。
可见,所有的工作目录都为:/home/songwei/WeiSONG/python,即便是被导入的文件在不同的目录,有不同的文件名。

PSMnet - Pyramid Stereo Matching Network复现笔记(二)import module、package PSMnet - Pyramid Stereo Matching Network复现笔记(二)import module、packagepackage、module是什么函数function模块module库文件libraryPython中module和library之间的区别包Package详细说明 复现的时候老是出现import错误,所以记录下~ package、module是什么 函数fun... 阅读详情

相关推荐

从Mule ESB到Apache Camel:手把手教你设计一个轻量级企业集成框架的‘心脏’

本文深入探讨了从Mule ESB到Apache Camel的轻量级企业集成框架设计实践,对比了两者在协议支持、消息处理能力和部署灵活性等方面的差异。通过实际代码示例和性能优化技巧,帮助开发者构建高效的核心模块,适用于现代微服务架构下的系统集成需求。

weixin_28738165的博客 375

python3-import_module方法和插拔式设计原理

一、import_module方法二、插拔式设计原理 一、import_module方法 import_module方法用来通过形如'aaa.bbb.ccc'的路径字符串,导入指定的模块: import importlib ret = importlib.import_module('myfile.b') # 等价于:from myfile import b print(ret) 注意:import_module只能导入到模块层次(即某一py文件),导入模块内成员会报错。 二、插拔式设计原理 d

花城的博客 4882

kettle从入门到精通 第九十二课 ETL之kettle 使用Kettle的Carte对外发布读写接口

场景:使用kettle实现将查询结果返回给客户端,也就是说kettle暴露查询接口供外围系统调用。前提必须是使用carte服务才可以提供接口供外部系统调用。具体实操方法如下:1、设计转换根据具体需求设计转换,主要用到的步骤有获取变量(从请求参数中获取变量)、json输入(解析入参),json 输出将结果转换为json格式输出到客户端。如下图所示:2、接收参数使用获取变量步骤来接收接口请求参数,变量通过${}方法进行获取,如下图${PARAM}则是获取PARAM参数,将参数赋值为req字段。

zhangjin1222的博客 954

python 模块导入---基础详解

python的模块(module),是以.py结尾的文件,包含了 Python 对象定义和Python语句;模块导入可以在一个模块中使用导入模块中的代码操作(函数、类、变量…),其作用可以更好的组织代码,提高代码的复用性。 模块大致可以分为三类: 内置模块:python自带的模块,例如上篇接触到的traceback模块… 第三方模块:别人写好的模块,需要pip install 安装 自定义模块:自己写的模块 导入方式: 第一种: import 路径.路径.模块 ; 路径从项目的根目录开始 第二种: fro

一条到晚游泳的鱼 983

软件测试方法——等价类划分法详解

!如果下面这些资料用得到的话可以直接拿走:1、自学开发或者测试必备的完整项目源码与环境2、测试工作中所有模板(测试计划、测试用例、测试报告等)3、软件测试经典面试题4、Python/Java自动化测试实战.pdf5、Jmeter/postman接口测试全套视频获取6、Python学习路线图。

MXB1220的博客 1万+

CA51F3系列(国产)+低功耗模式

CA51F351P6芯片是基于1T 8051内核的8位微控制器,通常情况下,运行速度比传统的8051芯片快10倍,性能更加优越。内置8K Flash程序存储器,可多次重复编程的特性给用户开发带来了极大的方便。不仅保留了传统8051芯片的基本特性,还集成了12Bit ADC、LCD/LED驱动、Touch Key、16Bit PWM、 UART、RTC、低电压检测(LVD)等功能模块。支持IDLE、STOP和低速运行三种省电模式以适应不同功耗要求的应用。

WANGJIHUIwang的博客 572

python使用小结

把之前的python使用方法全部汇总到这里 python排序方法 转载自这里 C/C++与Python C调用python接口方法 主要是参考下面两篇博文 使用c语言调用python小结 Python实例浅谈之三Python与C/C++相互调用 需要注意的是, 1.如果提示undefined reference to Py_XXXX 说明没有正确加载python的库...

a130098300的专栏 7349

汉字跨越三千年的生命力与数字时代适应性

文字作为文明载体,其演变规律始终遵循实用性与适应性的平衡。汉字作为现存最古老的文字系统,凭借形义结合的六书构造原理,实现了超方言的文化统一功能。在计算机处理方面,五笔输入法与Unicode支持证明了其技术兼容性,而视觉识别效率的先天优势使其在信息时代更具传播效力。从甲骨文识别AI到现代书法设计,汉字系统持续展现强大的文化承载力与技术适应性,这种活态传承为数字人文研究提供了独特样本。

weixin_29058331的博客 355

Python中动态导入对象importlib.import_module()的使用

先入为主 背景 一个函数运行需要根据不同项目的配置,动态导入对应的配置文件运行。 解决 文件结构 a #文件夹 │a.py │__init__.py b #文件夹 │b.py │__init__.py ├─c#文件夹 │c.py │__init__.py # c.py 中内容 args = {'a':1} class C: def c(self): ...

edward_zcl的博客 15万+

保姆级教程:用CANoe的LIN Slave Conformance Tester搞定一致性测试(附LDF配置避坑点)

本文详细介绍了如何使用CANoe的LIN Slave Conformance Tester进行汽车电子LIN从节点一致性测试,包括测试环境搭建、LDF文件配置、多通道测试技巧及常见问题解决方案。通过实战案例和高级配置技巧,帮助工程师高效完成测试任务,确保LIN总线通信的可靠性。

weixin_30385925的博客 526

上位机介绍:C# 开发者的必知基础

上位机是指在工业控制系统中,位于上层、负责人机交互和数据管理的计算机/软件,与“下位机”(PLC、传感器、变频器、单片机等硬件设备)相对应,核心是“向下通信控制设备,向上展示交互数据”。下位机:一线干活的“工人”(执行采集、控制指令);上位机:指挥管理的“办公室人员”(发指令、看数据、做报表)。C#开发者掌握上位机开发的核心是“通信+UI+稳定性基础层:搞懂WinForms/WPF基础、串口/Modbus通信,能实现核心功能;进阶层:掌握分层设计、异步编程、工业级容错(断线重连、数据校验);

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1559

Python通过__import__导入模块(import module)

_import__函数接受一个模块名作为参数,并返回对应的模块对象。__import__函数是一个底层的函数,通常情况下不建议直接使用它来导入模块。fromlist给出对象或子模块名,即应该根据给定名称而导入的模块名。函数可以动态地导入模块,但它并不是 Python 中首选的导入模块的方法。print(list(modules)) # 将map对象转换为列表,以便查看里面的模块对象。函数功能用于动态的导入模块,主要用于反射或者延迟加载模块。模块中的函数来导入模块,因为它们更加直观、易读和易维护。

weixin_42098295的博客 1046

AI绘画与医疗可视化:用AI生成医学插图的实践

医疗可视化是医学教育、临床沟通和学术研究的核心工具。传统医学插图依赖手工绘制或专业3D建模,存在制作周期长、成本高、更新迭代慢等问题。随着深度学习技术的发展,AI绘画工具(如Stable Diffusion、DALL-E)展现出强大的图像生成能力,但医疗领域对插图的解剖准确性、标注规范性和语义完整性有极高要求,通用AI模型难以直接应用。本文聚焦AI技术与医疗领域的交叉创新,系统阐述如何通过数据预处理、模型定制化训练和后处理校验,构建符合医疗标准的插图生成系统。

大模型应用工坊 1788

Python的Module,Library,Package的区别

目录 1、背景 2、module的简介 3、library的简介 4、package的简介 5、Python中的module和library之间的区别 6、Python中的module和package之间的区别 7、包的使用 8、包的一些问题 1、背景  Python中的module,library,package之间的区别。 2、module的简介  module:模块  Python中的module,说白了就是Python文件,而Python文件一般后缀为py,所以就是你的xxx.py。 3、libra

weixin_38638223的博客 4107

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python package module_关于Python Package下的Module import方式[转]

2012年有一个目标我没有达成,那就是深入学习和使用Python语言。这个目标被其他学习任务和工作无情的抢占了,当然最主要的原因还是我重视不够^_^。近期恰逢有一些Python工程的开发工作要做,就顺便略微深入地学习了一下Python:看了几本Python的英文大部头,比如《Learning Python 4th Edition》、《Python Essential Reference 4th E...

weixin_29489791的博客 190

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

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

python package module详解

python module package python import python from imort python 模块的引入

qq_41768644的博客 999

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python package module_浅谈 Python 的 package 和 module, import

从来没有尝试深入一点去了解 python 的 package 和 module ,今天稍微 google 了几篇文章看了下,做点记录,估计还是有很多错误的地方,还请指正。首先从 package 说起, package 意思就是包,那包里面就可以装点东西,比如再装一个小一点的包,或者放个手机。小一点的包的话就是 subpackage ,手机的话就是一个 module ,收音机也可以,就是收音机 mo...

weixin_39975261的博客 194

【go】建工程、初始化、module/package/import语法

初始化一个包含可执行 main 方法的 Go 工程,只需两条命令。下面我会分步说明,并解释每条命令的作用。操作步骤 1、创建并进入项目目录 首先,为你的项目创建一个独立的文件夹,并进入该目录: 2、初始化 Go 模块 (go mod init) 这是关键的一步,用于创建一个 Go 模块来管理你的项目依赖。运行以下命令: 模块名称通常是你的代码仓库的路径,例如 github.com/yourusername/myproject 。如果是本地测试,也可以使用一个简单的名称,例如 myproject 。执行后

m0_45406092的博客 567

探究 python import机制、module、package与名字空间

在开始之前,先了解一个内置函数dir(),它可以帮助我们分析一些内部的东西,dir()的描述是:dir(): 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。简单来说,不带参数时,会返回当前名字空间的内容(通常是locals名字空间)...

Alex的博客 2107

Python import module package 相关

【代码】Python import module package 相关。

OrdinaryMatthew的博客 447

python中的import

相对导入只能在 package 里面的 module 中使用,相对导入其实就是根据 package 变量来转换成绝对路径,然后再导入模块或者包.

x1343676的博客 895

python 的 import 机制

ImportError: attempted relative import with no known parent package 是如何造成的?

升级打怪记录 444

Python模块(Package Module)import陷阱

一个Python Module(模块),是一个文件,包含了Python对象定义和Python语句(definitions and statements)。文件名就是模块名加上后缀.py,在模块内部,模块名存储在全局变量__name__中,是一个string,可以直接在module中通过__name__引用到module name。 module是为了重复使用一些对象,比如类,函数,而将这些对象...

taoqick的专栏 906

python 包( package )和模块( module )的创建和引入( import )

**python 包( package )和模块( module )的创建和引入( import )**

1809

python中的import机制

python 自带的 module 称为 built-in module从上一节可以看到sys.path所得最前面的就是当前文件所在的目录(有时会显示为""因此如果在当前目录下创建与 built-in module 同名的.py文件并导入的话,python 根据sys.path中顺序寻找指定 module 时,会率先在当前目录下找到匹配的.py并导入,然后就停止搜索后续路径了,因此,此时导入的就是自定义的 module 而非 built-in module。

weixin_45696455的博客 1509

【Python】包管理,弄明白import,package,module

本文探讨了Python中的包管理机制,重点分析了import语句的工作原理。通过实例演示了同级目录下的模块导入方式,解释了import本质上是创建module实例并赋值的操作。文章详细说明了Python如何通过sys.path查找模块文件,以及目录结构和__init__.py文件对导入过程的影响。同时介绍了环境变量PYTHONPATH的配置方法,并对子目录导入进行了验证。实验表明,Python会优先加载带有__init__.py的目录作为package,即使没有该文件也能正常加载目录作为module。

Passer_hua的博客 939
上一篇: 转载(添加自己的理解): 支持向量机通俗导论(理解SVM的三层境界)
下一篇: Android光学字体识别 -- Android OCR demo
watkins
博客等级 码龄18年 1277粉丝 246原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值