Python -m参数原理及使用方法解析


Posted in Python onAugust 21, 2020

python -m xxx.py

作用是:把xxx.py文件当做模块启动

但是我一直不明白当做模块启动到底有什么用。python xxx.py和python -m xxx.py有什么区别!

自问自答:

python xxx.py
python -m xxx.py

这是两种加载py文件的方式:

1叫做直接运行

2把模块当作脚本来启动(注意:但是__name__的值为'main' )

不同的加载py文件的方式,主要是影响——sys.path 这个属性。sys.path 就相当于liunx中的PATH。
下面来看一下sys.path

>>> import sys
>>> sys.path
['', '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
...]

上面的内容我只截取了一段。此为当前python解释器运行的环境,python解释器会在这些目录下去寻找依赖的库!
注解一点:‘'——为当前目录

下面有两个例子,通过不同方式启动同一文件,sys.path属性的值有何不同。

# run.py 内容如下
import sys
print(sys.path)


# 直接启动:python run.py
test_import_project git:(master) ✗ python run.py
['/Users/sx/Documents/note/test_py/test_import_project', 
 '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
 ...]
# 以模块方式启动:python -m run.py
test_import_project git:(master) ✗ python -m run.py
['', 
 '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',

*** 细心的同学会发现,区别就是在第一行。

直接启动是把run.py文件,所在的目录放到了sys.path属性中。

模块启动是把你输入命令的目录(也就是当前路径),放到了sys.path属性中***

在工作场景中有什么用呢?

# 目录结构如下
package/
	__init__.py
	mod1.py
package2/
	__init__.py
	run.py
# run.py 内容如下
import sys
from package import mod1
print(sys.path)

如何才能启动run.py文件?

# 直接启动(失败)
➜ test_import_project git:(master) ✗ python package2/run.py
Traceback (most recent call last):
 File "package2/run.py", line 2, in <module>
  from package import mod1
ImportError: No module named package

# 以模块方式启动(成功)
➜ test_import_project git:(master) ✗ python -m package2.run
['',
'/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
...]

当需要启动的py文件引用了一个模块。你需要注意:在启动的时候需要考虑sys.path中有没有你import的模块的路径!
这个时候,到底是使用直接启动,还是以模块的启动?目的就是把import的那个模块的路径放到sys.path中。你是不是明白了呢?

官方文档参考:  http://www.pythondoc.com/pythontutorial3/modules.html

导入一个叫 mod1 的模块时,解释器先在当前目录中搜索名为 mod1.py 的文件。如果没有找到的话,接着会到 sys.path 变量中给出的目录列表中查找。 sys.path 变量的初始值来自如下:

  • 输入脚本的目录(当前目录)。
  • 环境变量 PYTHONPATH 表示的目录列表中搜索(这和 shell 变量 PATH 具有一样的语法,即一系列目录名的列表)。
  • Python 默认安装路径中搜索。
  • 实际上,解释器由 sys.path 变量指定的路径目录搜索模块,该变量初始化时默认包含了输入脚本(或者当前目录), PYTHONPATH 和安装目录。这样就允许 Python程序了解如何修改或替换模块搜索目录。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
python文字转语音实现过程解析
Nov 12 Python
python sorted方法和列表使用解析
Nov 18 Python
python中判断文件结束符的具体方法
Aug 04 Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 Python
python使用布隆过滤器的实现示例
Aug 20 #Python
QT5 Designer 打不开的问题及解决方法
Aug 20 #Python
Python配置pip国内镜像源的实现
Aug 20 #Python
Python使用lambda抛出异常实现方法解析
Aug 20 #Python
浅谈对python中if、elif、else的误解
Aug 20 #Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 #Python
Python自动化测试中yaml文件读取操作
Aug 20 #Python
You might like
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
python3中int(整型)的使用教程
2017/03/23 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Python实现的堆排序算法示例
2018/04/29 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python pandas库的安装和创建
2019/01/10 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
什么是python类属性
2020/06/10 Python
python db类用法说明
2020/07/07 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
高中课程设置方案
2014/05/28 职场文书
应届大学生自荐书
2014/06/17 职场文书
尊师重教演讲稿
2014/09/04 职场文书