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编程语言入门黑客攻防 给你几个理由!
Feb 02 Python
PyQt5每天必学之切换按钮
Aug 20 Python
python 不以科学计数法输出的方法
Jul 16 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 Python
Python下opencv使用hough变换检测直线与圆
Jun 18 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
如何用python免费看美剧
2020/08/11 Python
妈妈的账单教学反思
2014/02/06 职场文书
公司营业员的自我评价
2014/03/04 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
化学专业自荐信
2014/05/28 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书