相信刚接触Python的你必定有过如此经历,把全部的代码都写在 if __name__ == '__main__'
下,由于有人告诉你,这样比较符合 Pythonista 的代码风格。python
却不知这段代码的意义并非必定要存在于执行代码中,而是在平常工做中,为了调试某个模块的正确性,咱们每每会在当前模块下直接写一个 if __name__ == '__main__'
,测试逻辑写在下面,这样,在其余模块调用这个模块里的方法也好,类也好的时候,就不会去调用 if __name__ == '__main__'
下面的逻辑了。app
缘由很简单,由于 if __name__ == '__main__'
中的 __name__
表明的就是当前执行的模块名。测试
python一切皆对象,因此python的模块也是对象,他有一个 built-in module,叫 __name__
,存储着模块是如何被执行的,若是是执行当前模块,那么就显示 __main__
,若是是被引用进来的,就显示被引用的路径。ui
好了,解释完了这个奇妙的 __name__
后,咱们就来看下如何在其余模块中调用这个 __main__
呢?spa
首先来看下咱们待被执行的代码:3d
import sys
def main(args):
print(args)
if __name__ == '__main__':
print("执行以下代码 __name__ == '__main__'")
# 参数随便指定便可
main(sys.argv[1:])
复制代码
咱们来执行看下结果:调试
接下来咱们来使用 subprocess 模块来从其余模块中调用 __main__
code
import subprocess
process = subprocess.run(
['python', 'app.py', 'miracle'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE
)
print(process.stdout)
复制代码
调用结果cdn
使用 subprocess 的「优势」就是由于实际上是经过建立一个子进程来执行的程序,因此不受子程序的影响,不会出现程序抛异常或主动退出进程致使主程序也退出的尴尬问题。 「缺点」就是须要建立子进程,相对来讲资源消耗比较大。对象
subprocess 详细的用法详见这里很少作介绍,有兴趣的能够自行翻阅manual。
接下来咱们使用 runpy 模块来调用看看
import runpy
runpy.run_path('app.py', run_name='__main__')
复制代码
调用结果
使用 runpy 的优势就是不须要建立子进程,相对来讲资源消耗比较小。 缺点就是主程序会受待执行程序的影响,会出现待执行程序中抛异常或主动退出会致使主程序也退出的尴尬问题。
runpy 详细的用法详见这里很少作介绍,有兴趣的能够自行翻阅manual。
这两种方法就是比较经常使用的在一个模块中执行另外一个模块的 if __name__ == '__main__'
的方法。 总结来讲就是,一个是在子进程中执行代码,一个是在当前进程中执行代码。
好啦,今天的内容就到这了,感兴趣的你,能够试试能不能走出来~
注公众号「Python专栏」,后台回复「mainmodule」,获取本文全套源码!