Python | 别人家的代码 if __name__ == '__main__' 到底什么意思?

640?wx_fmt=png


相信刚接触Python的你一定有过如此经历,把所有的代码都写在 if __name__ == '__main__' 下,因为有人告诉你,这样比较符合 Pythonista 的代码风格。

殊不知这段代码的意义并不是一定要存在于执行代码中,而是在日常工作中,为了调试某个模块的正确性,我们往往会在当前模块下直接写一个 if __name__ == '__main__' ,测试逻辑写在下面,这样,在其他模块调用这个模块里的方法也好,类也好的时候,就不会去调用 if __name__ == '__main__' 下面的逻辑了。

原因很简单,因为 if __name__ == '__main__' 中的 __name__ 代表的就是当前执行的模块名。

python一切皆对象,所以python的模块也是对象,他有一个 built-in module,叫 __name__ ,存储着模块是如何被执行的,如果是执行当前模块,那么就显示 __main__ ,如果是被引用进来的,就显示被引用的路径。

640?wx_fmt=jpeg


好了,解释完了这个奇妙的 __name__ 后,我们就来看下如何在其他模块中调用这个 __main__ 呢?

首先来看下我们待被执行的代码:


 

import sys

def main(args):
  print(args)

if __name__ == '__main__':
  print("执行如下代码 __name__ == '__main__'")
  # 参数随便指定即可
  main(sys.argv[1:])

我们来执行看下结果:

640?wx_fmt=jpeg


接下来我们来使用 subprocess 模块来从其他模块中调用 __main__


 

import subprocess

process = subprocess.run(
  ['python', 'app.py', 'miracle'],
  stdin=subprocess.PIPE, stdout=subprocess.PIPE
)
print(process.stdout)

调用结果

640?wx_fmt=jpeg


使用 subprocess 的「优点」就是因为其实是通过创建一个子进程来执行的程序,所以不受子程序的影响,不会出现程序抛异常或主动退出进程导致主程序也退出的尴尬问题。 「缺点」就是需要创建子进程,相对来说资源消耗比较大。

subprocess 详细的用法详见这里不多做介绍,有兴趣的可以自行翻阅manual。


接下来我们使用 runpy 模块来调用看看


 

import runpy

runpy.run_path('app.py', run_name='__main__')

调用结果

640?wx_fmt=jpeg


使用 runpy 的优点就是不需要创建子进程,相对来说资源消耗比较小。 缺点就是主程序会受待执行程序的影响,会出现待执行程序中抛异常或主动退出会导致主程序也退出的尴尬问题。

runpy 详细的用法详见这里不多做介绍,有兴趣的可以自行翻阅manual。


这两种方法就是比较常用的在一个模块中执行另一个模块的 if __name__ == '__main__' 的方法。

总结来说就是,一个是在子进程中执行代码,一个是在当前进程中执行代码。


好啦,今天的内容就到这了,感兴趣的你,可以试试能不能走出来~

今天的代码都已上传至我的github:

https://github.com/MiracleYoung/exercises/exec_othermodule_main 


最后,放一个我的星球二维码,在我的星球里,你能够获得什么?

1. 「每周精选」

会总结一周来的得与失,以及热点、技术,做一个速递。

包括我付费参加的一些星球那学到的东西。

2. 「大航海计划」

由船长发起,分为多个阶段,或招募或淘汰若干名船员,每周都会在星球做一次项目汇报。目标是让球友能够在星球里找到志同道合的小伙伴一起驶向新世界。

目前这个计划首发由我担任船长,第一期船员招募已结束,第二期即将开启。

目的是通过游戏帮助python零基础船员从零开始学习python,并能够自己制作客户端,在游戏中体验编程的乐趣。而会python的也不会因为简单而弃船,因为游戏是公平的,你不可能出于绝对优势,总有人能够编写出一套强大的客户端来战胜你。


一天0.25元能买什么,而加入一个积极向上、努力的圈子永远都不晚。


640?wx_fmt=jpeg

推荐阅读:

一周速递 | 总结既往,不是为了抱歉,是为了微笑明天

万字谏言 | 零基础转行Python,到底路在何方?


已标记关键词 清除标记
相关推荐
main.py中的测试函数 import os.path as osp import pickle import model import weights import test def get_tf_implementation(weights_path, all_layer_outs=False): print("Making Structure") tf_model = model.make_deng_tf_test(verbose=True, all_layer_outs=all_layer_outs) print("Loading Weights") tf_model = weights.load_weights(tf_model, weights_path, verbose=True) return tf_model def get_test_data(cache_file): print("Loading Test Data") if osp.exists(cache_file): with open(cache_file, 'rb') as fid: roidb = pickle.load(fid) print('data is loaded from {}'.format(cache_file)) print(f"Number of Images to test: {len(roidb)}") return roidb def get_weighted_tf_implementation(weights_path, all_layer_outs=False): tf_model = get_tf_implementation(weights_path, all_layer_outs) model.show_model_info(tf_model) return tf_model def test_tf_implementation(cache_file, weights_path, all_layer_outs=False): # Get Weighted Model tf_model = get_weighted_tf_implementation(weights_path, all_layer_outs) # Load Cached Test Data roidb = get_test_data(cache_file) # Test Network results = test.test_net(tf_model, roidb) return results if __name__ == "__main__ 代码段: if __name__ == "__main__": results = test_tf_implementation(cache_file="roidb_test_19_smol.pkl", weights_path="rgbd_det_iter_40000.h5") Terminal运行一切正常,给cache-file和weights-path赋值,然后正常执行test_tf_implementation. 不知道问题出在哪里 错误提示: Using TensorFlow backend. EE ====================================================================== ERROR: main.get_test_data ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/xijiejiao/anaconda2/envs/python3/lib/python3.6/site-packages/nose/case.py", line 197, in runTest self.test(*self.arg) TypeError: get_test_data() missing 1 required positional argument: 'cache_file' -------------------- >> begin captured logging << -------------------- tensorflow: Level 1: Registering FakeQuantWithMinMaxArgs (<function _FakeQuantWithMinMaxArgsGradient at 0x1314c2598>) in gradient. tensorflow: Level 1: Registering FakeQuantWithMinMaxVars (<function _FakeQuantWithMinMaxVarsGradient at 0x1314c27b8>) in gradient. ``` ``` Error Traceback (most recent call last): File "/Users/xijiejiao/anaconda2/envs/python3/lib/python3.6/unittest/case.py", line 59, in testPartExecutor yield File "/Users/xijiejiao/anaconda2/envs/python3/lib/python3.6/unittest/case.py", line 605, in run testMethod() File "/Users/xijiejiao/anaconda2/envs/python3/lib/python3.6/site-packages/nose/case.py", line 197, in runTest self.test(*self.arg) Exception: get_test_data() missing 1 required positional argument: 'cache_file' -------------------- >> begin captured logging << -------------------- tensorflow: Level 1: Registering FakeQuantWithMinMaxArgs (<function _FakeQuantWithMinMaxArgsGradient at 0x1314c2598>) in gradient. tensorflow: Level 1: Registering FakeQuantWithMinMaxVars (<function _FakeQuantWithMinMaxVarsGradient at 0x1314c27b8>) in gradient. ``` ``` Error Traceback (most recent call last): File "/Users/xijiejiao/anaconda2/envs/python3/lib/python3.6/unittest/case.py", line 59, in testPartExecutor yield File "/Users/xijiejiao/anaconda2/envs/python3/lib/python3.6/unittest/case.py", line 605, in run testMethod() File "/Users/xijiejiao/anaconda2/envs/python3/lib/python3.6/site-packages/nose/case.py", line 197, in runTest self.test(*self.arg) TypeError: test_tf_implementation() missing 2 required positional arguments: 'cache_file' and 'weights_path' tensorflow: Level 1: Registering NcclAllReduce (<function _all_sum_grad at 0x131d62620>) in gradient. tensorflow: Level 1: Registering NcclReduce (<function _reduce_sum_grad at 0x131d628c8>) in gradient. tensorflow: Level 1: Registering NcclBroadcast (<function _broadcast_grad at 0x131d629d8>) in gradient. ``` ``` ====================================================================== ERROR: main.test_tf_implementation ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/xijiejiao/anaconda2/envs/python3/lib/python3.6/site-packages/nose/case.py", line 197, in runTest self.test(*self.arg) TypeError: test_tf_implementation() missing 2 required positional arguments: 'cache_file' and 'weights_path' ---------------------------------------------------------------------- Ran 2 tests in 0.020s FAILED (errors=2) Process finished with exit code 1 Assertion failed Assertion failed Assertion failed Assertion failed
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页