python包相关知识点之包的导入、相对路径以及绝对路径

目录
  • 一、包
  • 二、包的导入
    • 1.import 导入
    • 2.from...import...导入
    • 3.__init__.py文件
    • 4.from 包.模块 import *
  • 三、包的相对和绝对导入
    • 1. 绝对导入
    • 2.相对导入
  • 四、import 导入自定义包的子模块
  • 五、包的单独导入
  • 六、包的安装和发布
  • 总结

一、包

在我们的项目中,可能会有太多的模块

但是我们不能把所有的模块这样放在这里,这样项目会乱七八糟。

我们可以将所有相同类型的模块放在一个文件夹中,这个文件夹就叫做包

包就是文件夹,他用于存放文件也就是模块。包中也可以存放包

包就是一个包含了__init__.py文件的文件夹。

包只是模块的一种形式而已,包即模块。

包的结构:


|----__init__.py 包的标志文件
|----模块一
|----模块二
|----子包(文件夹)
|----|----__init__.py
|----|----子模块一
|----|----子模块二

二、包的导入

1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如demo0demo02.demo03,但都必须遵循这个原则。

2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

3.对比import demo和from demo import name的应用场景:

如果我们想直接使用name那必须使用后者。

1.import 导入

在demo01_test02.py 中 导入 demo01_test01.py

demo01_test01.py 源码:

def say():
    print('demo01_test01_hello')

name = '赵四'

demo01_test02.py 源码:

import base.demo01.demo01_test01
base.demo01.demo01_test01.say()    #  调用test01中的say方法 输出 demo01_test01_hello
import sys
print(sys.path)
#['D:\\pycharm工作空间\\day12\\base\\demo01', 'D:\\pycharm工作空间\\day12', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\Pythonwin', 'C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend']

2.from...import...导入

from 包名.模块名... import 变量名

使用方式: 例如 变量名() 或者print(变量名)

demo01_test02.py 源码:

from base.demo01.demo01_test01 import say
say() # demo01_test01_hello

from 包名.模块名... import 变量名1,变量名2,...

使用方式: 例如 变量名1() 或者print(变量名2)

demo01_test02.py 源码:

from base.demo01.demo01_test01 import say,name
say()
print(name)  # 调用test01中的name变量

from 包名 import 模块名

使用方式:模块名.变量名() 或者 print(模块名.变量名)

demo01_test02.py 源码:

from base.demo01 import demo01_test01
demo01_test01.say() # demo01_test01_hello

from 包名 import 模块名,模块名1...

使用方式:模块名.变量名() 或者 print(模块名1.变量名)

在demo01_test02.py中调用demo02_test01.py, demo02_test02.py 源码

demo02_test01.py 源码:

def say21():
    print('demo02_test01_hello')

demo02_test02.py 源码:

def say22():
    print('demo02_test02_hello')

demo01_test02.py 源码:

from base.demo02 import demo02_test01,demo02_test02
demo02_test01.say21() # demo02_test01_hello
demo02_test02.say22() # demo02_test02_hello

需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法

from base.demo02 import demo02_test02.say
# 报错 SyntaxError: invalid syntax

3.__init__.py文件

不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。

demo1下的__init__.py文件源码:

print('啦啦啦')

demo01_test02.py 源码:

from base.demo01 import demo01_test01

demo01_test01.say()
# 啦啦啦     __init__.py中的代码执行结果
# demo01_test01_hello

4.from 包.模块 import *

此处是想从包demo02中导入所有,实际上该语句只会导入包demo02下__init__.py文件中定义的名字,我们可以在这个文件中定义__all___:

demo02下__init__.py文件的源码:

print('呜呜呜')
name = '王大夫'

demo01_test02.py 源码:

from base.demo02 import *

print(name) # 王大夫
demo02_test01.say() # 报错 无法调用
# 输出:  呜呜呜
# NameError: name 'demo02_test01' is not defined

在demo02下的__init__.py文件中加入以下源码:

print('呜呜呜')
name = '王大夫'

__all__ = ['demo02_test01','demo02_test02']

再调用:

from base.demo02 import *

demo02_test01.say21()   #  成功调用
print(name) # 报错 变量name没有定义
 # 呜呜呜
 # demo02_test01_hello

三、包的相对和绝对导入

我们的最顶级包base是写给别人用的,然后在base包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:

绝对导入:以base作为起始

相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)

1. 绝对导入

在demo01中的demo01_test02.py中调用demo02中的模块

from base.demo01 import demo01_test01
demo01_test01.say()    

在 base目录下的py文件中调用demo01_test02.py

from base.demo01 import demo01_test02
demo01_test02.demo01_test01.say()

2.相对导入

在demo01中的demo01_test02.py中调用demo02中的模块

from ..demo02.demo02_test01 import say21
say21()

在 base目录下的py文件中调用demo01_test02.py

from base.demo01 import demo01_test02

demo01_test02.say21()
import sys
print(sys.path)
'''
啦啦啦
呜呜呜
demo02_test01_hello
demo02_test01_hello
['D:\\pycharm工作空间\\day12\\base', 'D:\\pycharm工作空间\\day12', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\Pythonwin', 'C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend']
'''

相对路径运行注意事项:

在没有明确指定包结构的情况下,Python 是根据 __name__ 来决定一个模块在包中的结构的,如果是 __main__ 则它本身是顶层模块,没有包结构,如果是base.demo01.demo02 结构,那么顶层模块是 base。

如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块

如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。

四、import 导入自定义包的子模块

特别需要注意的是:可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入

demo03中的test01源码:

def test():
    print('这是一个测试方法')

直接运行demo03_test02模块

import test01

test01.test()

import sys
print(sys.path)
'''这是一个测试方法
['D:\\pycharm工作空间\\day12\\base\\demo03', 'D:\\pycharm工作空间\\day12', 'D:\\pycharm工作空间\\day12\\base\\demo03', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\win32\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\Pythonwin', 'C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend']
'''

不会报错因为sys.path中已经添加了day05-包/demo03路径。Import会从sys.path中依次搜索路径。

在base目录下导入demo03_test02.py进行使用

from base.demo03 import test02
# 报错 ModuleNotFoundError: No module named 'test01'

因为此时的sys.path中只有demo01-包.py的路径 .../day05-包,import demo03_test01 只能从/day05-包下查找 demo03_test01模块。找不到因此报错。

解决import 导入包时的报错问题

我们可以在sys.path中添加import搜索的路径。

import sys,os
path = os.path.abspath(__file__)
print(path)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
print(BASE_DIR)
sys.path.append(BASE_DIR)
print(sys.path)
import base.demo03.test01
base.demo03.test01.test()  # 这是一个测试方法

五、包的单独导入

单独导入包名称时不会导入包中所有包含的所有子模块

import base.demo03

base.demo03.test01.test()
# 报错  AttributeError: module 'base.demo03' has no attribute 'test01'

解决办法:需要从__init__.py中进行初始化操作

进行上诉操作后:

六、包的安装和发布

1、在包的同级目录创建 setup.py

from distutils.core import setup

setup(name='bag',
      version='1.0,3',
      description='描述:这是我的第一个包',
      author='zxb',
      author_email='505555162@qq.com',
      py_modules=['test1', 'test2'],
      )

2.在命令行 运行 python setup.py build (可以不执行 )

构建模块

4.生成发布的压缩包 运行 python setup.py sdist

5、安装包

导入自己的包进行测试

测试成功!!

包的卸载: 直接找到对应的位置删除即可。

总结

到此这篇关于python包相关知识点之包的导入、相对路径以及绝对路径的文章就介绍到这了,更多相关python包的导入、相对及绝对路径内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Python2、Python3相对路径、绝对路径导入方法

    os.path.dirname() 获取父目录 os.path.basename() #获取文件名或者文件夹名 python2缺省为相对路径导入,python3缺省为绝对路径导入 python2绝对路径导入 from __future__ import absolute_import python2缺省会搜索上一级目录.上上级目录 解决方案: import platform pver=platform.python_version() pversion= int(pver.split('.')[

  • python根据路径导入模块的方法

    本文实例讲述了python根据路径导入模块的方法,分享给大家供大家参考.具体方法如下: 常规做法如下: import sys sys.path.append('C:/full/path') from foo import util,bar 而要直接通过路径 import imp util = imp.load_source('util', 'C:/full/path/foo/util.py') 使用时使用util.method,此时并没有定义method method = util.method

  • Python导入自定义路径的方法

    前言: Python可以引入指定路径的文件,原理就是使用sys.path.append加入到程序查找的路径. 实验目的:调用不同目录的类和接口,entry调用is_class和is_method的接口. 实验过程: 使用sys.path.append('Dir1\\Dir2'),把当前目录下的“Dir1\\Dir2”加入到python查找文件的路径下.import方法或者类就会在Dir1\\Dir2路径下查找. 测试目录:C:\\Users\\OOXX\\Desktop\\test 目录结构:

  • python添加模块搜索路径和包的导入方法

    方法一:函数添加 1 import sys 2 查看sys.path 3 添加sys.path.append("c:\\") 方法二:修改环境变量 w用户可以修改系统环境变量PYTHONPATH 方法三:增加.pth文件,推荐! 在site-packages添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的模块文件所在的目录名称就是了. 1 windows c:\python27\site-packages # 我们的学员把pth文件直接放在c:\pyt

  • 详解在Python中以绝对路径或者相对路径导入文件的方法

    1.在Python中以相对路径或者绝对路径来导入文件或者模块的方法 今天在调试代码的时候,程序一直提示没有该模块,一直很纳闷,因为我导入文件一直是用绝对路径进行导入的.按道理来讲是不会出现模块找不到的情况的. 最后仔细分析了整个代码的目录结构,才发现了问题. 下面依次来说明一下今天的情况 先看导入的代码: 在demo--mnist.py文件中执行以下两种导入操作 # 第一处 from gcforest.gcforest import GCForest from gcforest.utils.co

  • python中添加模块导入路径的方法

    python中自定义模块导入路径的方式主要有以下3种: (1)使用sys.path.append()随着程序执行,会动态地添加模块导入的路径,但是程序执行结束后就会立即失效(临时性的) import sys sys.path.append('自定义路径') (2)加入到环境变量PYTHONPATH用于当前用户 在用户主目录下有一个 .bashrc 隐藏文件,打开文件 sudo vim ~/.bashrc 添加单个路径的方法 export PYTHONPATH=<自定义路径>:$PYTHONPA

  • python包相关知识点之包的导入、相对路径以及绝对路径

    目录 一.包 二.包的导入 1.import 导入 2.from...import...导入 3.__init__.py文件 4.from 包.模块 import * 三.包的相对和绝对导入 1. 绝对导入 2.相对导入 四.import 导入自定义包的子模块 五.包的单独导入 六.包的安装和发布 总结 一.包 在我们的项目中,可能会有太多的模块 但是我们不能把所有的模块这样放在这里,这样项目会乱七八糟. 我们可以将所有相同类型的模块放在一个文件夹中,这个文件夹就叫做包 包就是文件夹,他用于存放

  • Python模块相关知识点小结

    本文实例讲述了Python模块相关知识点.分享给大家供大家参考,具体如下: 1.模块: 定义:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是以.py结尾的python文件(文件名:test.py,对应的模块名:test). 包:用来从逻辑上组织模块的,本质就是文件夹(目录),必须带有一个__init__.py文件. 导入包的本质就是解释这个包下面的__init__.py文件. 在某个模块下需要导入某一个包下面的内容,需要在包下面的__init__.py文件中修改

  • 详解Python的迭代器、生成器以及相关的itertools包

    对数学家来说,Python这门语言有着很多吸引他们的地方.举几个例子:对于tuple.lists以及sets等容器的支持,使用与传统数学类似的符号标记方式,还有列表推导式这样与数学中集合推导式和集的结构式(set-builder notation)很相似的语法结构. 另外一些很吸引数学爱好者的特性是Python中的iterator(迭代器).generator(生成器)以及相关的itertools包.这些工具帮助人们能够很轻松的写出处理诸如无穷序列(infinite sequence).随机过程

  • 详解python中的模块及包导入

    python中的导入关键字:import 以及from  import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数以及变量的, 比如说:包名为:com.test,在这个包底下有个模块为a.py,那么当其他包中的模块想要引入a模块的时候写法为 import com.test.a 在b.py中调用的方式为:com.test.a.(a中的函数或者变量),而不能直接写为a.(a中的函数名或者变量) (2)当导入的是包

  • 解决Python 命令行执行脚本时,提示导入的包找不到的问题

    在Pydev能正常执行的脚本,在导出后在命令行执行,通常会报自己写的包导入时找不到. 一:报错原因 在PyDev中,test.py 中导入TestUserCase里面的py文件时,会写: from TestUserCase.Test import Test 这在命Pydev中没错,但是在命令行中确出现错误. 因为在PyDev中默认路径除了当前文件所在路劲外,还有工程根路径.而在命令行中只有当前文件所在路径.TestUserCase是test.py文件的上一级目录,所以在命令行中test.py i

  • Pyhton模块和包相关知识总结

    一.模块 每一个以扩展名 py 结尾额 Python 源代码文件都是一个模块模块名 同样也是一个标识符,需要符合标识符的命名规则在模块中定义的 全局变量.函数.类 都是提供给外接直接使用的工具 模块的两种导入方式 1)import 导入 import 模块名1,模块名2 或 import 模块名1 import 模块名2 导入之后 通过 模块名. 使用 模块提供的工具--全局变量.函数.类 使用 as 指定模块的别名 import 模块名1 as 模块别名 注意:模块别名应该 符合 大驼峰命名法

  • 一文搞懂python异常处理、模块与包

    一 异常处理 1.什么是异常 Error(错误)是系统中的错误,程序员是不能改变的和处理的,如系统崩溃,内存空间不足,方法调用栈溢等.遇到这样的错误,建议让程序终止. Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复.遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常. 2常见异常 IndentationError: 缩进错误 KeyboardInterrupt: Ctrl+C被按下 UnboundLocalError : 有同名的全局变量 d = {'n

  • 详解Python模块化--模块(Modules)和包(Packages)

    目录 引言 Python Modules模块 导入模块 ①导入整个模块 ②导入模块中的特定函数 ③导入模块中的所有函数 给导入的模块一个别名 单独运行模块 加速模块加载 Python Packages包 引用包(Package)中的模块 引用包(Package)中子模块的函数或变量 利用相对路径引用包和模块 利用__all__提供包的显式索引 打包自己的Package并分发 安装python社区中的Package 总结 引言 在刚入门python时,模块化编程.模块.类库等术语常常并不容易理清.

  • Python实现多线程爬表情包详解

    目录 课程亮点 环境介绍 模块使用 流程 一. 分析我们想要的数据内容 是可以从哪里获取 二. 代码实现步骤 导入模块 单线程爬取10页数据 多进程爬取10页数据 课程亮点 系统分析目标网页 html标签数据解析方法 海量图片数据一键保存 环境介绍 python 3.8 pycharm 模块使用 requests >>> pip install requests parsel >>> pip install parsel time 时间模块 记录运行时间 流程 一. 分

  • python文件读取和导包的绝对路径、相对路径详解

    目录 一.文件读取的绝对路径和相对路径 二.package的绝对路径及相对路径导入 2.1 导包以绝对路径导入 2.2 导包以相对路径导入 三.运行脚本的当前工作路径和绝对路径 总结 文件目录层级 一.文件读取的绝对路径和相对路径 用相对路径和绝对路径读取上一层目录的文件.下一层目录的文件及读取同层级的文件. # @File : platform.py.py """1.绝对路径读取文件""" with open(r"C:\Users\c

随机推荐