包(package)与模块的导入--from与import
软件项目越来越大,复杂之后,模块会越来越多,我们需要对这些模块进行分门别类进行维护、管理,提出了包的概念。
包在目录结构上,往往是一个目录里包含多个模块子目录
myproj
├── cmdb # 代码目录
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── test.py
│ └── views.py
├── manager.py # 主入口运行文件
└── proj # 配置文件目录
├── settings.py
├── urls.py
└── wsgi.py
这里面的cmdb/proj都可以称之为包(package)。下面讲下同一个包里模块的相互调用以及不同包之间的模块的调用方式
- 同一个包(目录)里模块的调用
注意,在python2中有点不同,跨目录调用时,被调用模块目录里必须要有一个__init__.py的空文件,否则找不到对应模块。(其实Python3里没有这个文件的时候虽然可以找到模块,但是只能称作目录,还不是规范的包。)
- 不同包里的模块的相互调用
对于from语句加载包的一些规则:
1. 从当前目录开始一路加载到包,然后导入模块
但是这种方式的问题很明显,当在别的目录或别的机器上执行脚本时就出问题了。
2. 相对路径导入:
利用类似Linux中的".."相对路径的方式进行跨包导入。比如views.py想导入proj/settings.py模块,可以写"from ..proj import settings"。但是利用这种导入会有一个问题,就是当导入的路径要经过最上层路径时会报错"ValueError: attempted relative import beyond top-level package"。比如这里举的例子就会报错,因为cmdb/proj都是顶层目录了。一般实际使用中都是会跨最上层目录的,所以这种方式的弊端过于鸡肋,推荐使用下面介绍的方法。
3. 动态获取路径的方式(通用):
利用Linux中相对路径的概念:我们知道项目打包里面的目录是固定不变,不同包之间模块的调用借用相对路径。本方法原理就是使用sys.path环境变量,需要导入哪个模块,就将其目录加入到环境变量中。
先了解os模块的获取路径的几个方法:
__file__:任何一个脚本程序执行时环境变量dir()中都有这么一个变量(交互式环境下没有),它代表你执行时输入的程序的路径。
os.path.dirname(filename):代表文件的绝对目录
os.path.dirname():表示一个文件or目录的上一层目录,即父目录
sys.path:表示环境变量,里面默认有当前目录,site-package等几个目录。这里的“当前目录”得好好理解。在交换式环境下,这个值为空;
在本例中,它的值是你所处在的Linux的当前目录(/root/pystu/module2/practise/myproj)加上命令行中的目录(cmdb)合并而成的。这个值发现最终都是相当于文件绝对路径的目录部分,即sys.path[0] == os.path.dirname(os.path.abspath(__file__))
根据上面的案例,假设test.py里面想加载settings.py模块,这是属于跨了包(目录)。而如果是直接执行test.py作为入口,sys.path的当前路径下是找不到settings模块的。思路如下:
import os,sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
from proj import settings
settings.setting()
通过这种方式无论你在哪个目录,输入的命令是带了什么路径都能正常找到对应的模块。
转载于:https://www.cnblogs.com/pyops/articles/9297420.html
包(package)与模块的导入--from与import相关推荐
- Python的包(package)和模块(module)的区别,如何导入python包和模块,以及为什么可以把包名当作一个模块导入
本文主要讨论标题中的三大问题,接下来逐一分析: 文章大部分内容转载并重新整理自https://zhuanlan.zhihu.com/p/33913131 1. Python的包(package)和模块 ...
- Python中的包(package)、模块(module)、方法(function)的逻辑关系
1. 逻辑关系 首先给出它们三个的结构关系:包→模块→方法,对应于英文就是:package→module→function. 2. 分类说明 包(package):包是一个类似文件夹的东西,它里面包含 ...
- python的模块的导入和包的导入
python导入视频教程 egon知乎的python系列教程 egon的博客园博客地址 egon的51CTO博客地址 egon的B站帐号,python学习教程 知乎专栏除了python教程,还有很多其 ...
- python全栈工程师能接到私活么_Python全栈工程师(包、模块 的导入)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想 为了信仰 Python人工智能从入门到精通 $ pip3 install tensorflow : 第三方模块tensor ...
- 你真的搞懂ES6模块的导入导出规则了吗
前言 模块作为ES6规范的核心部分之一,在实际项目开发中经常会看到它的身影,那么我们是否真正了解它的相关规则呢,今天就带大家一起了解一下模块的导入导出规则 导入 ES6模块的导入(即import)大致 ...
- python中模块(Module)和包(Package)的区别 (导入模块、导入包)(import导包)
如下结构,mycompany就是包,abc.py和xyz.py就是模块 mycompany ├─ __init__.py ├─ abc.py └─ xyz.py 参考文章:Python中模块(Modu ...
- python的模块、包、库区别。导入包/模块的方式
直接进入主题,如果觉得文章可以,记得点点赞和关注,我主要会写一些在学习过程中遇到的困难 模块 为了使代码更容易维护,提高代码重用价值:可以将一组相关功能的代码写入一个单独的.py文件中:使别人导入使用 ...
- Python中模块(Module)和包(Package)的区别
1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个 ...
- python中大括号是什么_Python中模块(Module)和包(Package)到底是什么,有什么区别?...
1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个 ...
最新文章
- 普通粒子群算法和优化方法
- xp,win7,win2003,win2008常用命令集
- 飞桨PaddlePaddle送算力 | 每日登录即送12小时,连续5天还有加送!
- 【Qt Tips】QLineEdit内容过滤之setValidator和setInputMask浅析
- Linux查看:crontab开启状态
- 好看的某云紫色渐变HTML网站源码
- java反射 获取变量值_Java反射:如何获取变量的名称?
- 1*2*...*1000的末尾有多少个0?(Java实现)
- Linux内核源代码分析——vmstat核心代码注释
- java 传xml js_JavaScript实现的XML与JSON互转功能详解
- 01分数规划解析(转载)
- struts1 和struts 2区别
- 手机号注册获取随机验证码
- 你看,那个人好像一条狗啊~30岁以上的程序员该何去何从?
- it试用评估_it试用期员工自我评价
- 查看mysql 当前锁级别_mysql innodb下的锁及隔离级别
- 7月23日云栖精选夜读丨前端leader找我谈心:我是如何从刚毕业的前端菜鸟一步步成长为前端工程师的?...
- 吐血整理C++书单,萌新到大牛,要看哪些书?
- ping无盘服务器值高,服务器PING值过高的原因
- ARP 应用——检测IP地址冲突
热门文章
- SNAP7 PLC协议S7 PDU程式读取长度
- ubuntu20.04虚拟机使用水星mw150us无线usb接口网卡
- 研究生学php丢不丢人,研究生压力过大?导师给研究生朋友的一些建议
- 接上一篇——上海有哪些值得加入的互联网公司
- I/O error on POST request for “http://localhost:9411/api/v2/spans“
- Terraform基础(一)-什么是Terraform?
- Windows日志分析(上)
- EasyUI的datagrid分页,动态隐藏或显示列
- 30. 串联所有单词的子串(详细讲解版)
- ida安装包密码算法