python-sys模块、导入自定义包
import问题:https://zhuanlan.zhihu.com/p/69099185
一、sys模块
sys模块是python自带模块,包含了与Python解释器和它的环境有关的函数。利用 import 语句输入sys 模块。
dir(sys):通过dir()方法查看模块中可用的方
1. sys.path
sys.path:包含了Python解释器自动查找所需模块的路径的列表。
在Python启动时,sys.path根据内建规则和PYTHONPATH变量进行初始化。可以进行append、insert、pop、remove等各种列表相关的操作,但通常都进行append操作,在PYTHONPATH环境变量中增加相应的路径。sys.path.append("自定义模块路径"),这种方法是运行时修改,脚本运行后就会失效的。
sys.path列表里的路径分为三种:
- 当前执行脚本(主动执行,而不是被其他模块调用)所在路径。是列表中的第一个元素,若没有执行脚本,则是个空字符串。
- 第二种是python内置的标准库路径,PYTHONPATH。
- 其他的是安装的第三方模块路径。
python import某个A模块时,首先会从python的内置模块中查找,是否含有该模块的定义。若未查询到,然后会从sys.path对应的模块路径查询,是否含有对应模块的定义,如果搜索完成依然没有对应A模块时,则抛出import的异常。
2. sys.argv
sys.argv获取命令行参数, 返回值是List,列表的第一个元素是脚本名称,第二个元素开始才是真正的参数。文件test.py,内容如下:
import sys
print(sys.argv)
在命令行中运行:python3 test.py 33,输出如下:
['test.py', '33']
二、导入自定义包:
在实际开发中,默认包含了当前目录为搜索路径,所以,当前目录下的模块和子模块均可以正常访问。一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
但是若一个模块需要import平级的不同目录的模块,或者上级目录里面的模块,就可以通过修改path来实现,方法有以下几种:
1. 临时添加模块完整路径
使用sys.path.append(path)添加相关的路径,通过该方法添加的目录,只能在执行当前文件的窗口中有效,窗口关闭后即失效。个人比较推荐这种方法,比较干净,避免一些冲突问题。
比如现在的代码目录结构:
/src/configs/config.py
/src/common/Database.py
假如Database.py期望导入config.py,则可以增加上级目录到sys.path列表里面:
parent_path = os.path.dirname(sys.path[0]) 去掉文件名,返回目录
if parent_path not in sys.path:
sys.path.append(parent_path)
import configs.config
最好加个判断,避免重复加入。也可以使用下面的代码:
import sys
sys.path.append(‘../’) # 动态添加a_package文件夹的所在路径
2. 将模块保存到指定位置
对 Python 本身进行扩展的模块,应该直接安装在 Python 内部以便被所有程序共享,此时就可借助于 Python 默认的模块加载路径(保存在 sys.path 变量中)。
通常来说,默认将 Python 的扩展模块添加在lib\site-packages路径下,它专门用于存放Python的扩展模块和包。
3. 设置环境变量
使用PYTHONPATH环境变量,在这个环境变量中输入相关的路径,不同的路径之间用逗号(英文的!)分开。
如果PYTHONPATH 变量不存在,可以创建它!路径会自动加入到sys.path中,而且可以在不同的python版本中共享,应该是一样较为方便的方法。
4. 增加.pth文件,推荐!
在site-packages下新建.pth文件(用于添加额外的sys.path),将模块的绝对路径写进去,一行一个路径。解释器启动时,.pth文件里列举出来的存在于文件系统的目录将被添加到sys.path。如果它被添加到系统级的Python解释器,安装一个.pth文件可能需要管理员权限。
这个不失为一个好的方法,但存在管理上的问题,而且不能在不同的python版本中共享。
三、绝对路径和相对路径导包的区别:
1. 绝对路径导包:
从当前执行脚本所在路径中导入需要的module。
2. 相对路径导包:
单点表示引用的模块或包,与当前模块在同一目录中(同一个包中)。
两点表示引用的模块,在当前模块所在位置的父目录中。
相对导入只适用于顶级包之内的模块,用了相对导入的模块文件不能作为顶层执行文件。
python-sys模块、导入自定义包的更多相关文章
- python之模块导入和包
一.何为模块 1.一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.模块目的和函数,对象等一样,是为了代码的复用性而存在的.即一个py程序写了很多功能,也可 ...
- python sys模块导入和模块的使用
sys故名思意,就是系统模块,系统模块内置很多方法,怎么样去调用方法呢 1,argv 参数 sys.argv() 2,exit() 退出程序 sys.exit() 3,version 获取版本信息 ...
- [python]关于在python中模块导入问题追加总结
[背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...
- python sys模块(12)
在python sys模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数!关于sys模块在官网也有详细的介绍:python sys模块官方介绍. 一.sys模块简介 sys.arg ...
- python random模块导入及用法
random是程序随机数,很多地方用到,验证码,图片上传的图片名称等,下面说说python random模块导入及用法 1,模块导入 import random 2,random用法 random.r ...
- python Calendar 模块导入及用法
Calendar 是python 日历模块,此模块的函数都是日历相关的,例如打印某月的字符月历,星期之类的模块,下面剖析python Calendar 模块导入及用法. 1,python导入日历模块 ...
- python基础之import模块导入和包的调用
模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...
- Python开发基础-Day16import模块导入和包的调用
模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...
- python sys模块
sy模块主要用于:解析器及环境 命令行参数 python xx.py xx1 xx2注:xx.py: sys.argv[0] 脚本名称 xx1 sys.argv[1] 第1个参数退出程序 sys.ex ...
随机推荐
- jQuery中使用$.each()遍历数组时要注意的地方
使用jQuery中 $.each()遍历数组,要遍历的数组不能为空(arry!="") 例如: $.each(arry, function (i, item) ...
- 07 Sublime Text3常用快捷键
通用常用类(General) ↑↓←→:上下左右移动光标,注意不是不是 KJHL ! Alt:调出菜单 Ctrl + Shift + P:调出命令板(Command Palette) Ctrl + ` ...
- Java知识系统回顾整理01基础01第一个程序07Eclipse使用----找不到类如何解决?
一.现象 有时候会碰到如图所示的问题,分明有Hello这个类,并且也有主方法,可是运行就会出现找不到或者无法加载类Hello,或者Class Not Found 异常. 出现这个状况,有多种原因造成, ...
- Linux为STDOUT的关键字设置颜色
echo "颜色测试aaa实测" | perl -pe 's/(aaa|实|测)/\e[1;31m$1\e[0m/g'
- 2016年 实验四 B2B模拟实验
实验四 B2B模拟实验 [实验目的] ⑴.掌握B2B中供应商的供求信息发布.阿里商铺开设和订单交易等过程. ⑵.掌握B2B中采购商的采购信息的发布.交易洽谈.网上支付和收货等过程. [实验条件] ⑴ ...
- 多测师讲解接口测试 _postman(上)_高级讲师肖sir
Postman 一.Postman介绍 Postman是一个网页调试工具,也可以调试css.html Postman的操作环境 环境:Postman Mac.Windows X32.Windows X ...
- Android开发教程之密码框右侧显示小眼睛
现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套[Android进阶学习视频].[全套Android面试秘籍].[Android知识点PDF] ...
- form中的标签例子
<form action="dreamdu.php" method="post" id="dreamduform"> <f ...
- AT一万亿港元市值之差,腾讯和阿里到底“差”在哪里?
很少有人注意到,港股之王已经悄然易主. 2019年底,阿里巴巴赴港二次上市,中国两大互联网巨头终于有了统一的比较口径,同台竞技之下,我们发现一个惊人事实--截止9月5日,港股阿里巴巴市值5.9万亿港元 ...
- swoft运行流程
启动命令 php bin/swoft http:start 或者 swoftctl run -c http:start 1 入口文件 bin/swoft.php #!/usr/bin/env php ...