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

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

如何导入sun.misc.BASE64Encoder和sum.misc.BASE64Decoder

右击项目名--->Build Path--->Configure Build Path...--->java Build Path--->Access rules:1 rule defined,added to all librar...   --->Edit --->Add...