Python常用模块——包&跨模块代码调用

Python常用模块——包&跨模块代码调用

一、包(Package)

当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据库交互的都放一个文件夹,把与页面交互相关的放一个文件夹。

my_proj/
├── apeland_web  #代码目录
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── my_proj    #配置文件目录
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包

一个包就是一个文件夹,但该文件夹下必须存在init.py 文件, 该文件的内容可以为空,init.py用于标识当前文件夹是一个包。

这个init.py的文件主要是用来对包进行一些初始化的,当当前这个package被别的程序调用时,init.py文件会先执行,一般为空, 一些你希望只要package被调用就立刻执行的代码可以放在init.py里。

二、跨模块导入

目录结构如下

my_proj
├── apeland_web
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── my_proj
    ├── settings.py
    ├── urls.py
    └── wsgi.py

根据上面的结构,如何实现在apelandweb/views.py里导入myproj/settings.py模块?

直接导入的话,会报错,说找到不模块

是因为路径找不到,my_proj/settings.py 相当于是apeland_web/views.py的父亲(apeland_web)的兄弟(my_proj)的儿子(settings.py),settings.py算是views.py的表弟啦,在views.py里只能导入同级别兄弟模块代码,或者子级别包里的模块,根本不知道表弟表哥的存在。这可怎么办呢?

答案是添加环境变量,把父亲级的路径添加到sys.path中,就可以了,这样导入 就相当于从父亲级开始找模块了。

apeland_web/views.py中添加环境变量

import sys ,os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印当前被执行的模块.py文件相对路径,注意是相对路径
print(BASE_DIR) # 输出是/Users/alex/PycharmProjects/apeland_py_learn/day4_常用模块/my_proj
sys.path.append(BASE_DIR)
from  my_proj import settings
print(settings.DATABASES)

三、官方推荐的跨目录导入方法

虽然通过添加环境变量的方式可以实现跨模块导入,但是官方不推荐这么干,因为这样就需要在每个目录下的每个程序里都写一遍添加环境变量的代码。

官方推荐的玩法是,在项目里创建个入口程序,整个程序调用的开始应该是从入口程序发起,这个入口程序一般放在项目的顶级目录。

这样做的好处是,项目中的二级目录 apeland_web/views.py中再调用他表亲my_proj/settings.py时就不用再添加环境变量了。

原因是由于manage.py在顶层,manage.py启动时项目的环境变量路径就会自动变成….xxx/my_proj/这一级别

原文地址:https://www.cnblogs.com/Kwan-C/p/11620962.html

时间: 2024-10-11 00:46:53

Python常用模块——包&跨模块代码调用的相关文章

Python进阶(十一)----包,logging模块

Python进阶(十一)----包,logging模块 一丶包的使用 什么是包: ? 包是通过使用 .模块名的方式组织python模块名称空间的方式. 通俗来说,含有一个__init__.py文件的文件夹就是包. 包的作用: ? 将文件夹/模块组织起来,来提高程序的结构性和可维护性. ? 目的不是运行,为了导入使用.包只是一种形式,包的本质就是一个模块 import: # 创建一个包,也会发生三件事: ''' 1. 将该aaa包内 __init__py文件加载到内存. 2. 创建一个以aaa命名

python 库 、包 、模块

概念: 模块: 模块是一种以.py为后缀的文件,在.py文件中定义了一些常量和函数.模块的名称是该.py文件的名称.模块的名称作为一个全局变量__name__的取值可以被其他模块获取或导入. 模块的导入通过ipmort来实现,导入模块的方式如下: import 特定模块名称 库: Python中的库是借用其他编程语言的概念,没有特别具体的定义,Python库着重强调其功能性.在Python中,具有某些功能的模块和包都可以被称作库.模块有诸多函数组成,包由诸多模块机构化组成,库中也可以包含包.模块

Python基础之包与模块

本文和大家分享的主要是python中包与模块相关内容,一起来看看吧,希望对大家学习python有所帮助. 摘要 1. 为重用以及更好的维护代码, Python 使用了模块与包:一个 Python 文件就是一个模块,包是组织模块的特殊目录(包含 __init__.py 文件). 2. 模块搜索路径, Python 解释器在特定的目录中搜索模块,运行时 sys.path 即搜索路径. 3. 使用 import 关键字导入模块,注意 import * 与 __all__ 的关系. 1. 模块与导入 A

Python学习 之 包和模块

1.rpm -ql python #查看python在计算机中安装了哪些文件 2.模块是一个可以导入的Python脚本文件 包是一堆按目录组织的模块和子包,目录下的__init__.py文件存放了包的信息 可以用import *,import * as *,from * import *等语句导入模块和包 3.Python的模块可以按目录组织为包,创建一个包的步骤是: (1)创建一个名字为包名字的文件夹 (2)在该文件夹下创建一个__init__.py文件 (3)根据需要在该文件夹下存放脚本文件

Python导入自定义包或模块

一般我们会将自己写的python模块与python自带的模块分开存放以达到便于维护的目的. Python 运行环境在查找模块时是对 sys.path 列表进行遍历,如果我们想在运行环境中添加自定义的模块,主要有以下三种方法: 1.在sys.path列表中添加新的路径(只能对执行了sys.path.append命令的当前Python运行环境起作用,对其他运行环境不起作用,也即"一次性"的). >>> import sys >>> sys.path &g

Python常用的内建模块

PS:Python之所以自称“batteries included”,就是因为内置了许多非常有用的模块,无需额外安装和配置,即可直接使用.下面就来看看一些常用的内建模块. datetime dateime是Python中处理日期和时间的标准库. 获取当前日期和时间 原文地址:https://www.cnblogs.com/yunche/p/8999052.html

Python常用的包

Python常用的处理数据的包和它的Tutorial(点击每个包的名称): Numpy:提供对多维数组的支持,支持矢量运算,速度快 matplotlib.pyplot:图表的绘制 Pandas:基于 Numpy 构建的含有更高级数据结构和工具的数据分析包 原文地址:https://www.cnblogs.com/lnlin/p/9135304.html

Python中导入包中模块的方法及区别

如果我们要使用一个package中定义的一个module,有两种导入方式 方法1: from package import module 方法2: import package import package.module 这两种方法的区别是通过方法1导入后,程序中可以直接使用module短命,而通过方法2导入后,程序中必须使用完整名称,即通过package.module使用,如果只导入package而不导入module,那么只有package中定义的__init__.py模块中的内容可用(使用该

【Absible学习】Ansible常用模块---包管理模块

yum_repository模块 yum_repository模块可以管理远程主机上的yum仓库. 模块参数 参数 说明 name 必须参数,用于指定要操作的唯一的仓库ID,也就是".repo"配置文件中每个仓库对应的"中括号"内的仓库ID baseurl 设置yum仓库的baseurl description 设置仓库的注释信息,也就是".repo"配置文件中每个仓库对应的"name字段"对应的内容. file 设置仓库的配