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查找函数f(x)=0根的解决方法
May 07 Python
Python中列表的一些基本操作知识汇总
May 20 Python
使用python检测主机存活端口及检查存活主机
Oct 12 Python
python实现按行切分文本文件的方法
Apr 18 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
python版飞机大战代码分享
Nov 20 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
python+mysql实现学生信息查询系统
Feb 21 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
Python tkinter模版代码实例
Feb 05 Python
pycharm 实现调试窗口恢复
Feb 05 Python
python pygame入门教程
Jun 01 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
CI框架给视图添加动态数据
2014/12/01 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
Python使用matplotlib绘制动画的方法
2015/05/20 Python
Python实现股市信息下载的方法
2015/06/15 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
python判断输入日期为第几天的实例
2018/11/13 Python
python组合无重复三位数的实例
2018/11/13 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
Python Map 函数的使用
2020/08/28 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
C#中的验证控件有几种
2014/03/08 面试题
函授毕业自我鉴定
2013/12/19 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
三严三实对照检查材料
2014/09/22 职场文书
售房协议书范本2014
2014/10/23 职场文书
车间质检员岗位职责
2015/04/08 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python