定位和执行Python模块(运行)

命令行选项的–m选项搜索给定的模块并将其作为__main__模块执行。Python标准模块中的runpy模块在内部支持此机制,该脚本允许使用Python模块命名空间而不是文件系统来定位脚本。

该模块定义了两个功能

run_module()

该函数执行指定模块的代码,并返回生成的模块全局字典。

mod_name参数应为绝对模块名称。如果模块名称引用的是软件包而不是普通模块,则导入该软件包,然后执行该软件包中的__main__子模块,并返回结果模块全局字典。

在执行模块代码之前,会在全局字典中设置特殊的全局变量__name__,__spec__,__file__,__cached__,__loader__和__package__。

如果命名模块是软件包,则__name__设置为mod_name +'.__ main__',否则设置为mod_name参数。

__file__,__cached__,__loader__和__package__根据模块规范设置为正常。

run_path()

此函数在给定路径下执行文件中的代码,并返回生成的模块全局字典。提供的路径可以引用Python源文件,编译的字节码文件或包含__main__模块的有效sys.path条目(例如,包含顶级__main__.py文件的zip文件)。

在执行模块代码之前,会在全局字典中设置特殊的全局变量__name__,__spec__,__file__,__cached__,__loader__和__package__。

如果此可选参数不为None,则将__name__设置为run_name,否则将其设置为'<run_path>'。

示例

将以下脚本另存为runpyeample.py

#runpy example
def add(x,y):
   return x+y
def main():
   x,y = 10,20
   print (add(x,y))
   return
if __name__=='__main__':
   main()

执行以上示例的通常过程如下

>>> import runpyexample as rp
>>> rp.main()
30
>>>

但是,我们现在使用runpy模块来执行它而不实际导入它。

>>> import runpy
>>> runpy.run_module('runpyexample', run_name='__main__')
30

您也可以使用run_path()函数。

>>> runpy.run_path('runpyexample.py', run_name='__main__')
30

如前 ,runpy支持Python命令行的–m开关。

E:\python37>python -m runpyexample
30