[python]自问自答:python -m参数? (转)

python -m xxx.py

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

自问自答:

  1. python xxx.py
  2. python -m xxx.py

这是两种加载py文件的方式:
1叫做直接运行
2相当于import,叫做当做模块来启动

不同的加载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.cnblogs.com/xueweihan/p/5118222.html

时间: 2024-10-07 05:07:13

[python]自问自答:python -m参数? (转)的相关文章

python 基础 如何让程序接收参数,最简单用sys.argv[]来获取

python 基础 如何让程序接收参数,最简单用sys.argv[]来获取 1.用法 import sys  #导入sys模块 sys.argv[tag]  #根据参数的下标来取值 其中 tag为下标值,其中程序本身为0,sys.argv[0] 2.举例 (test_3.4.2) [[email protected] lab]# vim argv.py import sys print (sys.argv[0]) print (sys.argv[1]) print (sys.argv[2]) p

ZMAN的学习笔记之Python篇:函数可变长参数

ZMAN的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 这次来聊聊Python中函数的“可变长参数”,在实际中经常会用到哦~  一.什么是“可变长参数” “可变长参数”就是向一个函数传入不定个数的参数.比如我写一个函数:传入一个学生参加各科目考试的成绩,求平均分,如两个学生分别传入(92, 91, 88)和(88, 95),因为每个学生参加的考试个数不同,因此传入的参数个数也就不同了,遇到这种情况,我们在定义函数的时候,可以使用“可变长参数”. 二.在定义函数时使用“可变长参数

Python定义函数时,不同参数类型的传递

python的底层是通过C语言实现,因此参数调用时是通过地址传递的(和C语言一样,值是单向传递,指针才能实现双向传递),比如: # -*- coding: utf-8 -*-def f1(x,y): z=x+y y=x return z a= 1 b=2 c=f1(a, b) print c, a, b 得到的结果是 3 1 2 从这里可以看出b值并没有变化,也就是说值是单向传递的. 函数的定义时,参数可以是数值,列表(当元组处理),字典等,其参数定义形式如下: def f(a, *pargs,

Python装饰器AOP 不定长参数 鸭子类型 重载(三)

1 可变长参数与关键字参数 *args代表任意长度可变参数 **kwargs代表关键字参数 用*args和**kwargs只是为了方便并没有强制使用它们. 缺省参数即是调用该函数时,缺省参数的值若未被传入,则传入默认预设的值. 注意 : 须将所有带有默认值的参数置于参数列表的末尾. def print_info(name, age = 18,gender = True ) print_info("zhan", gender = False ) def demo(num, *nums ,

Python函数中的可变长参数_速记

一.Python函数中的参数 1.使用python的函数时,有参数类别,比如位置参数.关键字参数.可变长参数 2.位置参数.关键字参数很好理解,关键是可变长参数经常能见到,但是一直没有搞懂是什么意思 二.可变长参数 1.一个星号:函数可以接收任意个数的参数,只需要在形参前面加一个*(星号),一个星号形参的函数会把多个位置参数值当成元祖的形式传入,也就是传入的多个参数值可以在函数内部进行元祖遍历 def length_param(a, *args): print("a=", a) pri

Python 的几个命令行参数

1) 以 $ python 方式启动 python 解释器,之后 import 一个模块,将生成 .pyc 文件. 2) 以 $ python -O 方式启动 python 解释器,之后 import 一个模块,将生成优化的字节码 .pyo 文件. 3) 以 $ python -m 模块名(不带.py) ,以命令行方式运行一个模块,其结果和使用 $ python 模块名.py 相同. 4) 以 $ python -c 命令字符串,以命令行方式运行一个字符串形式的 python 语句,例如 $ p

Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装和基本使用 Memcached安装: ? 1 2 3 4 5 6 7 8 wget http://me

Python代写,Python作业代写,代写Python,代做Python(微信leechanx)

Python代写,Python作业代写,代写Python,代做Python(微信leechanx) Redis:Cannot assign requested address的解决办法 客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即"Cannot assign requestedaddress".是客户端的问题不是服务器端的问题.通过netstat,的确看到很多TIME_WAIT状态的连接.

python基础教程:python的环境搭建

Python编程语言可应用于多平台包括 Linux 和 Mac OS X.一般的 Linux 发行版本都自带 Python,Mac OS X 最新版也自带了 Python,也就是已经安装好了,不需要再配置. Windows 下直接下载最新版的 Python 2.7.9,安装的时候注意选择 你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本. Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, Su