python2和python3(导包)自定义包并导入之

2024-05-05 15:08

本文主要是介绍python2和python3(导包)自定义包并导入之,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、module和Package的定义

A module is a file containing Python definitions and executable statements( intended to initialize the module), file name is the module name 

Packages are a way of structuring Python’s module namespace by using “dotted module names”.

也就是说package是module(文件)的一种组织结构,这种组织结构用'.'来组织上下层次关系,如下所示:

sound/                          Top-level package__init__.py               Initialize the sound packageformats/                  Subpackage for file format conversions__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/                  Subpackage for sound effects__init__.pyecho.pysurround.pyreverse.py...filters/                  Subpackage for filters__init__.pyequalizer.pyvocoder.pykaraoke.py

package的定义有了,那么如何来表现呢?

在解析器搜索过程中,把一个含有__init__.py文件的目录(文件夹)视作package。

目录的存储层级就是包和模块的层级,在引用时候‘.’来表现这种上下层关系就可以了。

如导入sound目录下的effects目录下的echo模块只需要

import sound.effects.echo
or
from sound.effects import echo

(代码一)

二、包内引用(Intra-package References)

同包内的子模块之间可以通过绝对路径的方式相互引用,如上面的import sound.effects.echo,里面的sound就

可以通过遍历sys.path里面目录搜索到。

如果觉得绝对路径引用不合适,还可以选择相对导入 relative imports,相对导入只需要将某一层替换为'.'或者'..'

如下

from . import echo
from .. import formats
from ..filters import equalizer

这里面'.'代表当前目录所在的包(子包),'..'代表上级目录所在的包(子包)。

(实际测试import .effects.echo无效)

三、实战演示

1) python2自定义包并导入

首先在任意路径创建一个文件夹,来放我们自定义的包的文件。
我的是创建在/home/xyh/test_package,下边是我的目录结构。要在另一个不相关的文件夹下的python应用中引用到我们自定义的包。就是在/home/xyh/test_package2/use_lucky_package.py中导入lucky_package.py这个包,测试直接

 import lucky_package或者直接from test_package import lucky_package是不行的。

需要在test_package文件夹中创建_init_.py文件,里边什么都不需要编辑。尝试一下,可以了。

注释:如果有初始化需要可以放到_init_.py中。

2) python3自定义包并导入

python 3.3+开始支持隐式命名空间包。

通俗的讲就是如果_init_.py中不需要放初始化,那么可以直接省略掉

如果_init_.py中的初始化不能省略,那么_init_.py可以像python2中一样保留下来。

 parent_package/__init__.py            <- EMPTY, NOT NECESSARY in Python 3.3+child_package/__init__.py       <- STILL REQUIRED if you want to run an initialization scriptchild1.pychild2.pychild3.py

如果在python3中要导入同目录到包,还可以在包名前加上一个. ,来解决找不到包的问题,如下:

from .user import User
from .dir import Dir

常见错误

from .foo import foo

执行时候报错

ImportError: attempted relative import with no known parent package

把.去掉,同时把foo.py的目录添加到PYTHONPATH中即可

解释:把.去掉那么就不是导package了,而是导入module,解析器搜索module的默认目录在 sys.path变量里面, sys.path变量默认被初始化成

  • build-in

  • The directory containing the input script (or the current directory when no file is specified).(同目录, 注意是主脚本的同目录)

  • PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).

  • The installation-dependent default.

所组成的list

这篇关于python2和python3(导包)自定义包并导入之的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961991

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到