if __name__== "__main__" 的意思(作用)python代码复用

转自:大步's Blog   http://www.dabu.info/if-__-name__-__main__-mean-function-python-code-reuse.html

有人在学习python脚本时会发现有的脚本下面有几行代码;

 
1
2
if __name__== "__main__":
main()

不明白其中的意思,其实这就是方便我们代码复用的,我们可以在其他脚本方便的调用另外一个脚本里面的函数。

假设下载我有下面一个python代码,叫做: pysysinfo.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python
#A system information gathering script
import subprocess
 
#command 1          //这段代码是查询系统信息的
uname = "uname"        
uname_arg = "-a"
print "gathering system information with $s command:\n" % uname
subprocess.call([uname,uname_arg])
 
#command 2       //这段代码是查询磁盘分区使用情况的
diskspace = "df"
diskspace_arg = "-h"
print "gathering diskspace information %s command:\n"  %  diskspace
subprocess.call([diskspace,diskspace_arg])

但是如果我们只想用其中第一段command 1的代码查询系统信息,怎么办呢?难道把这个脚本的后面command 2代码删除?that is foolish!!还有一个好的方法就是可以去将上面的代码功能封装成模块,然后通过模块调用其中的函数,方便我们多次调用,而又不需要重新改写代码。下面是将上面的代码封装好,函数化,放到模块中的改进脚本:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python
#A system information gathering script
import subprocess
 
#command 1
def uname_func()
uname = "uname"
uname_arg = "-a"
print "gathering system information with $s command:\n" % uname
subprocess.call([uname,uname_arg])
 
#command 2
def disk_func()
diskspace = "df"
diskspace_arg = "-h"
print "gathering diskspace information %s command:\n"  %  diskspace
subprocess.call([diskspace,diskspace_arg])
 
#main function that call other functions
def main()
uname_fun()
diskspace_fun()
 
main()

问题是当我们要调用其中的函数的时候,如何让脚本知道是我们到底是想让它直接运行还是只是作为模块引入另外一个脚本呢?.py有两种使用方式,一种是作为模块被调用,另外一种是直接运行。那么如何判断呢?于是就有了以下改进!!!

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python
#A system information gathering script
import subprocess
 
#command 1
def uname_func()
uname = "uname"
uname_arg = "-a"
print "gathering system information with $s command:\n" % uname
subprocess.call([uname,uname_arg])
 
#command 2
def disk_func()
diskspace = "df"
diskspace_arg = "-h"
print "gathering diskspace information %s command:\n"  %  diskspace
subprocess.call([diskspace,diskspace_arg])
 
#main function that call other functions
def main()
uname_fun()
diskspace_fun()
 
if __name__== "__main__":
main()

在main()函数前加入了一个判断语句,以此来让脚本判断自己是被当做模块调用,还是被直接运行的。当被import作为模块调用的时候,if以下的代码就不会被执行,也就是说main()函数不会被执行。

为了更好说明,引用下面一篇文章来让我们更加明白

python中if __name__ == '__main__': 的解析

模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。

///////////////////////////////////////////////////////////////////////////////////////////////////

在cmd 中直接运行.py文件,则__name__的值是'__main__';

而在import 一个.py文件后,__name__的值就不是'__main__'了;

从而用if __name__ == '__main__'来判断是否是在直接运行该.py文件

如:

#Test.py

class Test:

def __init(self):pass

def f(self):print 'Hello, World!'

if __name__ == '__main__':

Test().f()

#End

你在cmd中输入:

C:>python Test.py

Hello, World!

说明:"__name__ == '__main__'"是成立的

你再在cmd中输入:

C:>python

>>>import Test

>>>Test.__name__                #Test模块的__name__

'Test'

>>>__name__                       #当前程序的__name__

'__main__'

无论怎样,Test.py中的"__name__ == '__main__'"都不会成立的!

所以,下一行代码永远不会运行到!

通过这篇文章,我们知道,.py文件会根据自身的使用方式,它的__name__的属性会不同。如果他的属性是“__main__”,那么脚本就知道自己是被直接执行的。如果是被别的文件import的来用,__name__的属性就会是脚本自己的文件名,从而防止错误的执行。引入的if语句的作用就是  通过检查该模块的__name__属性来实现判断.py文件被使用的方式。从而方便我们代码复用,也可以测试模块。

if __name__== "__main__" 的意思(作用)python代码复用的更多相关文章

  1. Python中if __name__ == '__main__':的作用和原理

    if __name__ == '__main__':的作用 一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行. ...

  2. python 中 if __name__ == '__main__' 判断的作用

    假设这样一个a.py文件 def fun1(): ........ def fun2(): ......... if __name__=='__main__': ......#执行的一些语句 当你执行 ...

  3. Python中的if __name__='__main__'语句的作用

    笔者在自学Python的过程中,对于if __name__='__main__'的用法感到很困惑,在think Python一书中原作者的源代码是这么解释if __name__='__main__'语 ...

  4. python:代码复用与函数递归

    #recursion.py:打印斐波那契数列 def fact(n): if n==1 or n==2: return 1 else: return fact(n-1)+fact(n-2) while ...

  5. python中__name__=='__main__'的作用

      学习python语法的过程中碰到了__name__=='__main__',这里做个笔记. 作用   这段代码的作用就是让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行. 测试 先 ...

  6. python if __name__ == '__main__'解析

    废话不多说,正题: python中所有的模块都有一个内置属性 __name__,一个模块的 __name__ 的值取决于如何应用模块.如果 import 一个模块,那么模块__name__ 的值通常为 ...

  7. if __name__ == '__main__' 这段代码怎么理解???

    __name__是内置变量,可用于表示当前模块的名字,而“__main__”等于当前执行文件的名称. 两个名称搞不清没关系,往下看待会解释 对很多编程语言来说,程序都需要一个入口,例如C系列.Java ...

  8. 关于python的【if __name__ == "__main__":】

    学习东西真的需要自己动手,然后遇到问题,自己学着去解决.当然如果能得到高人指点,那真是走了八辈子运了.可以节省很多时间.但是大多数情况下,不能总是有高人来指点我们.这时就需要靠我们自己了. 在学习py ...

  9. (转)Python中如何理解if __name__ == '__main__'

    摘要 通俗的理解 __name__ == '__main__' :假如你叫李凯.py,在朋友眼中,你是李凯( __name__ == '李凯' ):在你自己眼中,你是你自己( __name__ == ...

随机推荐

  1. 聊聊Unity项目管理的那些事:Git-flow和Unity

    0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了.敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理.项目从最初使用svn到之后的Git One Track策略再到现在的GitFlo ...

  2. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  3. Convert BSpline Curve to Arc Spline in OpenCASCADE

    Convert BSpline Curve to Arc Spline in OpenCASCADE eryar@163.com Abstract. The paper based on OpenCA ...

  4. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  5. TypeScript Vs2013 下提示Can not compile modules unless '--module' flag is provided

    VS在开发TypeScript程序时候,如果import了模块有的时候会有如下提示: 这种情况下,只需要对当前TypeScript项目生成设置为AMD规范即可!

  6. css样式之border-image

    border-image-source 属性设置边框的图片的路径[none | <image>] div { border: 20px solid #000; border-image-s ...

  7. BAT“搅局”B2B市场,CIO们准备好了吗?

    "CIO必须灵活构建其所在企业的IT系统,深入业务,以应对日新月异的数字化业务环境."   BAT军团"搅局"B2B市场,CIO们准备好了吗? 庞大的企业级市场 ...

  8. Android Studio:Failed to resolve ***

    更换电脑后,也更新了所有的SDK的tool,仍然报错:Failed to resolve  各种jar包,出现这种问题主要是因为在Android studio中默认不允许在线更新,修改方法如下:

  9. mysql查询性能优化

    mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...

  10. Oracle使用触发器和mysql中使用触发器的比较——学习笔记

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...