从python run 和python unittest两种eclipse运行方式深入理解if __name__ == "__main__"
2015-02-06 14:37
696 查看
在写一个简单的python测试程序的时候,发现eclipse中Run as "Python run 和 Python unittest”结果不一样?为什么会不一样?
先贴一下代码段:
在eclipse中对此代码段进行调试,发现:
1,在python真正入口操作中有所不同,run方式会执行到main函数中,而python unittest不会执行到。
2,run方式会根据控制来执行对应的测试,而python unittest执行全部测试
其中,调试python unittest方式main函数进入如下函数:
此时的modname为文件名:handle_new_plan_test;通过这样的查看,可知,在python unittest运行的时候,文件作为一个模块导入到了执行程序pydev_runfiles.py中。似乎有点说明一个问题:Python文件的执行有"导入执行”和“未导入执行(就是执行自身)“
还是有些迷糊?那么接下来的说明会更清晰。
因为程序执行的时候,总会有一个不同的地方,那就是上面说的那个问题。那么python到底是怎么去做模块导入执行和自身执行的呢?
贴一段测试代码:
python作为一种脚本语言,我们用python写得各个module都可以可以包含__main__,当然也可以不包含,主要的体现就在:
1,当单独执行此module时,会根据__main__中逻辑去执行,其结果为:
2 , 当该module被其他的module引入使用时,其中的"if __name__ == "__main__":所表示的逻辑不会被执行,这是因为当被其他模块引用时,__name__的值将发生变化,其将是文件module的名字,如之前 __get_module_from_str()函数所获得modname,所以if条件为false,那么将不会执行到后面的逻辑。
到此,开始的疑问也就解决掉了!
先贴一下代码段:
# -*- coding: utf-8 -*- ''' Created on 2015-1-28 @author: z.q.ot ''' import unittest from driver import Driver from new_plan_api import new_plan_check, new_plan_accept, new_plan_reject,\ plans_detail, plans_detail_today import json from unittest import runner new_plan_id_array = [] class Test(unittest.TestCase): def setUp(self): print "setUp" self.driver_info = Driver(usr='soil',pwd='soil',channel=1,typ=3) self.token_id = self.driver_info.driver_login() #self.new_plan_id_array = [] def tearDown(self): print "tearDown" # @unittest.skip("not check new plan") def testA_Check_new_plan(self): print "testCheck_new_plan......" result = new_plan_check(self.token_id) print result JsonResult = json.loads(result,"utf-8"); if JsonResult["result"] == 0: print "check new plan is success and the new plan count is: %d"%JsonResult["data"]["page"]["total"] self.new_plan_count = JsonResult["data"]["page"]["total"] for i in range(self.new_plan_count): new_plan_id_array.append(JsonResult["data"]["rows"][i]["id"]) else: print "check new plan is fail and result code is: %d"%JsonResult["result"] @unittest.skip("not accept new plan") def testB_Accept_new_plan(self): print "testAccept_new_plan......" print new_plan_id_array for i in new_plan_id_array: print "new_plan_id is %d" % i new_plan_accept(i, self.token_id) # @unittest.skip("not Reject new plan") # def testC_Reject_new_plan(self): # print "testReject_new_plan......" #new_plan_reject(plan_id=1, self.token_id) # @unittest.skip("not get detail today") def testD_detail_today(self): print "Get today plans......" plans_detail_today(self.token_id) def suite(): suite = unittest.TestSuite() suite.addTest(Test("testD_detail_today")) #suite.addTest(Test("testA_Check_new_plan")) #suite.addTest(Test("testB_Accept_new_plan")) return suite #or use like this #tests=['testA_Check_new_plan','testB_Accept_new_plan','testD_detail_today'] #return unittest.TestSuite(map(Test,tests)) if __name__ == "__main__": #import sys;sys.argv = ['', 'Test.testName'] #unittest.main() runner = unittest.TextTestRunner() runner.run(suite())
在eclipse中对此代码段进行调试,发现:
1,在python真正入口操作中有所不同,run方式会执行到main函数中,而python unittest不会执行到。
2,run方式会根据控制来执行对应的测试,而python unittest执行全部测试
其中,调试python unittest方式main函数进入如下函数:
def __get_module_from_str(self, modname, print_exception, pyfile): """ Import the module in the given import path. * Returns the "final" module, so importing "coilib40.subject.visu" returns the "visu" module, not the "coilib40" as returned by __import__ """ try: mod = __import__(modname)//入口就进入这里 for part in modname.split('.')[1:]: mod = getattr(mod, part) return mod except: ......更多的代码查看源码pydev_runfiles.py
此时的modname为文件名:handle_new_plan_test;通过这样的查看,可知,在python unittest运行的时候,文件作为一个模块导入到了执行程序pydev_runfiles.py中。似乎有点说明一个问题:Python文件的执行有"导入执行”和“未导入执行(就是执行自身)“
还是有些迷糊?那么接下来的说明会更清晰。
因为程序执行的时候,总会有一个不同的地方,那就是上面说的那个问题。那么python到底是怎么去做模块导入执行和自身执行的呢?
贴一段测试代码:
#-*- coding: utf-8 -*- def sayHello(): print "hello" if __name__ == "__main__": print "__main__" sayHello()
python作为一种脚本语言,我们用python写得各个module都可以可以包含__main__,当然也可以不包含,主要的体现就在:
1,当单独执行此module时,会根据__main__中逻辑去执行,其结果为:
>>> __main__ hello >>>
2 , 当该module被其他的module引入使用时,其中的"if __name__ == "__main__":所表示的逻辑不会被执行,这是因为当被其他模块引用时,__name__的值将发生变化,其将是文件module的名字,如之前 __get_module_from_str()函数所获得modname,所以if条件为false,那么将不会执行到后面的逻辑。
到此,开始的疑问也就解决掉了!
相关文章推荐
- Pycharm上python unittest不执行"if __name__ == '__main__' "问题or选择非unittest run
- python unittest不执行"if __name__ == '__main__' "问题(Pycharm)
- python 中 if __name__ == "__main__" 的理解
- Python中if __name__=="__main__"的理解
- 关于Python中if __name__ == "__main__"的理解
- python中的if __name__ == "main" 的理解
- python unittest 没有执行 if __name__=='__main__'
- Python 中的 if __name__ == "__main__" 该如何理解
- 对Python的if __name =="__main__"一些理解
- python中if __name__ == "__main__":解释
- python 关于 if __name__ == “__main__" 的使用
- 【Python】if __name__ == "__main__":
- Python命令 (if __name__=="__main__":)
- if __name__== "__main__" 的意思(作用)python代码复用
- python if __name__ == '__main__':(有例子就是好理解)
- Python入门:简单理解if __name__ == '__main__':
- python中if __name__ == "__main__"的解释
- 【Python】|(转)if __name__ == "__main__"详细解释
- Python中if __name__ == "__main__": 的作用
- python中 if __name__ == '__main__': 的理解