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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
分析在Python中何种情况下需要使用断言
Apr 01 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
python基于phantomjs实现导入图片
May 13 Python
全面理解Python中self的用法
Jun 04 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
python中plot实现即时数据动态显示方法
Jun 22 Python
python安装requests库的实例代码
Jun 25 Python
python实现最大子序和(分治+动态规划)
Jul 05 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
超级详细实用的pycharm常用快捷键
May 12 Python
使用scrapy实现增量式爬取方式
Jun 21 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
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
Python Deque 模块使用详解
2014/07/04 Python
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
深入理解Python中的*重复运算符
2017/10/28 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
详解python里的命名规范
2018/07/16 Python
python连接mongodb密码认证实例
2018/10/16 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
python 三元运算符使用解析
2019/09/16 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
python实现KNN近邻算法
2020/12/30 Python
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
英国在线泳装店:Simply Swim
2019/05/05 全球购物
2014年社区学雷锋活动总结
2014/03/09 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
实习公司领导推荐函
2014/05/21 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书