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模块、导入自定义包的更多相关文章

  1. python之模块导入和包

    一.何为模块 1.一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.模块目的和函数,对象等一样,是为了代码的复用性而存在的.即一个py程序写了很多功能,也可 ...

  2. python sys模块导入和模块的使用

    sys故名思意,就是系统模块,系统模块内置很多方法,怎么样去调用方法呢 1,argv 参数 sys.argv() 2,exit() 退出程序 sys.exit() 3,version  获取版本信息 ...

  3. [python]关于在python中模块导入问题追加总结

    [背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...

  4. python sys模块(12)

    在python sys模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数!关于sys模块在官网也有详细的介绍:python sys模块官方介绍. 一.sys模块简介 sys.arg ...

  5. python random模块导入及用法

    random是程序随机数,很多地方用到,验证码,图片上传的图片名称等,下面说说python random模块导入及用法 1,模块导入 import random 2,random用法 random.r ...

  6. python Calendar 模块导入及用法

    Calendar 是python 日历模块,此模块的函数都是日历相关的,例如打印某月的字符月历,星期之类的模块,下面剖析python Calendar 模块导入及用法. 1,python导入日历模块 ...

  7. python基础之import模块导入和包的调用

    模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...

  8. Python开发基础-Day16import模块导入和包的调用

    模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...

  9. python sys模块

    sy模块主要用于:解析器及环境 命令行参数 python xx.py xx1 xx2注:xx.py: sys.argv[0] 脚本名称 xx1 sys.argv[1] 第1个参数退出程序 sys.ex ...

随机推荐

  1. jvm优化案例

    案例1 survivor区太小,每次Minor GC存活的对象进入老年代,导致老年代可用空间不足,经常发生FULL GC,导致系统变慢 案例问题描述 有一个数据计算系统,从mysql和其他数据源提取数 ...

  2. MySQL 向表中插入、删除数据

    一.向表中插入一条信息 1.查看表中的数据 mysql> SELECT * FROM user; +----+---------+----------+ | id | account | pas ...

  3. Java (二)基于Eclipse配置Commons IO的环境

    上一篇:Java (一)下载APACHE Commons IO 一.新建一个Java Project 二.使用鼠标右键点击工程,选择New > Folder 三.在Folder name输入文件 ...

  4. java的string方法使用

    1.将list转换为","隔开的字符串 //videoIdList值转换成 1,2,3 String videoIds = StringUtils.join(videoIdList ...

  5. RHSA-2018:3032-低危: binutils 安全和BUG修复更新

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  6. Mybatis中进行批量更新(updateBatch)

    更新多条数据,每条数据都不一样 背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新.(2)一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作 ...

  7. ansible-初始playbook安装nginx

    1. ansible-初始playbook安装nginx 1) 创建一个ansible存放路径 1 [root@test-1 scripts]# mkdir -p /ansible/nginx/{co ...

  8. 微信小程序 audio组件 默认控件 无法隐藏/一直显示/改了controls=‘false’也没用2019/5/28

    <audio>默认控件,如果需要隐藏,不需要特意设置controls = 'false',直接把这个属性删除即可,不然无论如何都会存在 之前,设置了controls = 'false' & ...

  9. IIS日志文件越来越大导致C盘空间变小处理方法

    问题概述 C:\inetpub\logs\LogFiles\W3SVC文件夹越来越大,IIS日志会消耗大量的硬盘空间,有潜在写满整个硬盘空间的风险,为了解决这个问题很多用户会选择关闭日志,但显然IIS ...

  10. form中的标签例子

    <form action="dreamdu.php" method="post" id="dreamduform"> <f ...