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. CENTOS 6.5 平台离线编译安装 Mysql5.6.22

    一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...

  2. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  3. potrace源码分析一

    1 简介 potrace是由Dalhousie University的Peter Selinger开发一款位图轮廓矢量化软件,该软件源码是可以公开下载的,详细见项目主页:http://potrace. ...

  4. bootstrap-fileinput 简单使用

    bootstrap-fileinput 是一款图片/文件上传 bootstrap 插件,简单示例代码: <!DOCTYPE html> <html> <head> ...

  5. jQuery.Ajax IE8 无效(CORS)

    今天在开发的时候,遇到一个问题,$.get()在 IE8 浏览器不起作用,但 Chrome,Firefox 却是可以的,网上资料很多,最后发现是 IE8 默认不支持 CORS 请求,需要手动开启下: ...

  6. python 3.5 成功安装 scrapy 的步骤

    http://www.cnblogs.com/hhh5460/p/5814275.html

  7. myeclipse 内存不够用报错PermGen space 和 An internal error has occurred.

    最近项目中又增加了新的模块,项目的代码又多了不少.运行的时候总是报如下错误 Exception in thread "http-apr-80-exec-6" java.lang.O ...

  8. java中易错点(一)

    由于replaceAll方法的第一个参数是一个正则表达式,而"."在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成"/".如果想替换的只是&qu ...

  9. 设计模式C#合集--单例模式

    单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...

  10. “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春

    火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...