相信刚接触 Python 的你一定有过如此经历, 把所有的代码都写在?
if __name__ == '__main__'?
下, 因为有人告诉你, 这样比较符合 Pythonista 的代码风格.
殊不知这段代码的意义并不是一定要存在于执行代码中, 而是在日常工作中, 为了调试某个模块的正确性, 我们往往会在当前模块下直接写一个? if __name__ == '__main__'?, 测试逻辑写在下面, 这样, 在其他模块调用这个模块里的方法也好, 类也好的时候, 就不会去调用? if __name__ == '__main__'? 下面的逻辑了.
原因很简单, 因为? if __name__ == '__main__'? 中的?__name__? 代表的就是当前执行的模块名.
python 一切皆对象, 所以 python 的模块也是对象, 他有一个 built-in module, 叫?__name__?, 存储着模块是如何被执行的, 如果是执行当前模块, 那么就显示?__main__?, 如果是被引用进来的, 就显示被引用的路径.
好了, 解释完了这个奇妙的?__name__? 后, 我们就来看下如何在其他模块中调用这个?__main__? 呢?
首先来看下我们待被执行的代码:
- import sys
- def main(args):
- print(args)
- if __name__ == '__main__':
- print("执行如下代码 __name__ =='__main__'")
- # 参数随便指定即可
- main(sys.argv[1:])
我们来执行看下结果:
接下来我们来使用 subprocess 模块来从其他模块中调用?__main__
- import subprocess
- process = subprocess.run(
- ['python', 'app.py', 'miracle'],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE
- )
- print(process.stdout)
调用结果
使用 subprocess 的「优点」就是因为其实是通过创建一个子进程来执行的程序, 所以不受子程序的影响, 不会出现程序抛异常或主动退出进程导致主程序也退出的尴尬问题. 「缺点」就是需要创建子进程, 相对来说资源消耗比较大.
subprocess 详细的用法详见这里不多做介绍, 有兴趣的可以自行翻阅 manual.
接下来我们使用 runpy 模块来调用看看
- import runpy
- runpy.run_path('app.py', run_name='__main__')
调用结果
使用 runpy 的优点就是不需要创建子进程, 相对来说资源消耗比较小. 缺点就是主程序会受待执行程序的影响, 会出现待执行程序中抛异常或主动退出会导致主程序也退出的尴尬问题.
runpy 详细的用法详见这里不多做介绍, 有兴趣的可以自行翻阅 manual.
这两种方法就是比较常用的在一个模块中执行另一个模块的? if __name__ == '__main__'? 的方法.
总结来说就是, 一个是在子进程中执行代码, 一个是在当前进程中执行代码.
相信大家在学 python 的时候肯定会遇到很多难题, 以及对于新技术的追求, 这里推荐一下我们的 Python 学习扣 qun:784758214, 这里是 python 学习者聚集地!! 同时, 自己是一名高级 python 开发工程师, 从基础的 python 脚本到 web 开发, 爬虫, django, 数据挖掘等, 零基础到项目实战的资料都有整理. 送给每一位 python 的小伙伴! 每日分享一些学习的方法和需要注意的小细节
点击: python 技术分享交流 http://0x9.me/9LBJY
来源: http://www.bubuko.com/infodetail-3053217.html