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用模块pytz来转换时区
Aug 19 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
Python 获取主机ip与hostname的方法
Dec 17 Python
Python字符串的常见操作实例小结
Apr 08 Python
Python的numpy库下的几个小函数的用法(小结)
Jul 12 Python
解决Django中调用keras的模型出现的问题
Aug 07 Python
一行python实现树形结构的方法
Aug 09 Python
如何基于python实现归一化处理
Jan 20 Python
PyQt5 界面显示无响应的实现
Mar 26 Python
如何通过python实现IOU计算代码实例
Nov 02 Python
python 三边测量定位的实现代码
Apr 22 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
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
php 各种应用乱码问题的解决方法
2010/05/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php curl 上传文件代码实例
2015/04/27 PHP
php实现的操作excel类详解
2016/01/15 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
通过javascript设置css属性的代码
2009/12/28 Javascript
Javascript的闭包
2009/12/31 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
让python json encode datetime类型
2010/12/28 Python
python实现简单登陆流程的方法
2018/04/22 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
甲方资料员岗位职责
2013/12/13 职场文书
农村葬礼主持词
2014/03/31 职场文书
商场促销活动策划方案
2014/08/18 职场文书
一般党员对照检查材料
2014/09/24 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
OpenCV实现常见的四种图像几何变换
2022/04/01 Python