Python: 如何在一个模块中执行另一个模块的 if __name__ == '__main__' 部分的代码

如题所述,我们将一起来看一下如果想在一个模块中执行另一个模块中的 if __name__ == '__main__' 部分的代码有哪些常用的方法。

要执行的模块的代码:

$ cat another.py
# -*- coding: utf-8 -*-
import sys


def main(args):
    print(args)


if __name__ == '__main__':
    print("run code below __name__ == '__main__'")
    main(sys.argv[1:])

通过 python another.py 运行:

$ python3.6 another.py test
run code below __name__ == '__main__'
['test']

使用 subprocess 模块

示例代码如下:

$ cat test_a.py
# -*- coding: utf-8 -*-
import subprocess

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

测试:

$ python3.6 test_a.py
b"run code below __name__ == '__main__'\n['test']\n"

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

subprocess 详细的用法详见 官方文档

使用 runpy 模块

示例代码:

$ cat test_b.py
# -*- coding: utf-8 -*-
import runpy

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

测试:

$ python3.6 test_b.py
run code below __name__ == '__main__'
[]

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

runpy 的详细用法详见 官方文档

结束语

这两种方法就是比较常用的在一个模块中执行另一个模块的 if __name__ == '__main__' 部分的代码的方法。总结来说就是,一个是在子进程中执行代码,一个是在当前进程中执行代码。

希望本文能对你有所帮助。


Comments