
——查找并执行 模块源代码 Lib/runpy.py模块是用来寻觅并运行的那种模块, 在不用先进行导入的情况之下。它主要是为达成命令行开关而发挥作用, 借此能够准许使用模块命名空间而非依靠文件系统去定位脚本。需留意, 这可不是一个沙盒模块, 所有代码是在当前进程里运行的, 所有的副作用, 像其他模块针对导入操作进行了缓存这种情况, 在函数返回之后都会留存下来。除此之外, 当函数返回之后, 任何经由已执行的代码所定义的函数以及类, 都无法确保能够正确地运行。要是存在某一使用场景, 无法接受这样的限制, 那么选择别的可能会更适宜一些。模块提供两个函数执行给定模块的代码, 代码会先运用标准的导入机制去查找, 依据详情参阅的PEP 302 进行定位, 之后在全新的命名空间里运行, 最后返回结果模块的字典。参数, 应当是一个绝对模块名。一旦模块名所指向的是一个包, 却并非一般的模块, 那么此包便会被导入, 接着要去执行包里的子模块, 随后返回结果模块的字典。有可用于在代码执行之前预先把模块的字典填充上情况存在的字典参数可供选择, 所给出的字典参数是不会被进行修改的, 要是在字典当中定义了以下任意当中的一个专门特殊的全局变量, 那么这些定义全都肯定是会被覆盖的。要是可选参数, 并非为, 那就设为, 要是此名称的模块属于一个包, 那就设为, 加上 ., 不然的话, 就设为参数。以设定成为适宜的、符合实际情况的方式去导入模块, 也就是说, 此模块的.name必然是特定的某个式子加上 ., 而非另外的某种不存在形式。、、 和 根据模块规范进行若给出了参数, 其值是什么情况下, sys.argv 会被更新成对应的值, sys.会被更新成临时模块对象。在函数返回之前, sys.argv跟sys.会被复原。特此留意, 这般针对的操纵并非线程安全的, 别的线程极有可能会目睹初始化未完备的模块, 以及历经变动过后的参数列表, 要是从线程里头的代码来调用该项函数, 提议单实例去运行模块。参见选项由命令行提供相同功能。更改发生在3.1版, 此版本加入了一种能力, 该能力是查找子模块并且执行软件包。经过 3.2 版本的更改, 实现了加入全局变量这一动作, 此全局变量与 PEP 3147 相关联, 是有关于它的参考依据的。在3.4版进行了更改: 充分运用PEP 451所增添的模块规格功能, 使得以此种方式运行的模块能够准确设置, 并且保证真正的模块名称始终能够借助.name的形式来进行访问。runpy.(, None, None)执行处在指定位置的代码, 并且返回其结果模块所对应的字典。跟赋予代码行的脚本名称相同的前提之下, 给出的路径能够指向像是源文件那样的, 或是此前编译完毕的字节码文件以及还包含模块的有效的sys.path项, 这里举例子来说, 就是一个含有顶级.py文件的zip文件。话说对于直接写就的脚本来讲, 那指定的代码会径直在一个全新的模块命名空间里运行。就一个有效的sys.path项来说, 通常它是个zip文件亦或是目录, 这个有效的sys.path项首先会被添进sys.path名单的开头处。而后, 这项特殊的函数会凭借更新之后的路径去查找并且执行相应的模块。需要特别留意的是, 虽说在所指定的位置那儿并不存在一个主模块, 然而针对在调用却不存在特别的保全举措, 以此来防止调用存在于sys.path其他地方的。借助可选用的字典参数, 能够在代码开展执行行动之前预先填充模块的字典, 所给出的字典参数不会被予以更改, 要是给出的字典里界定了下述特殊全局变量, 那么这些定义都会被覆盖。The , , ,, and are set in the the code is (Note that this is set of - other may be set as ).如果该可选参数不为则 被设为 否则为 。要是所提供的路径直接对一个脚本文件进行了引用, 不管这个脚本文件是源码文件, 还是预编译的字节码, 那么, 将被设为给出的路径, 而另外的、、和都将被设为。假设给出的路径是给有效sys.path项的引用那么, 对于导入的模块将会进行正确设置, 亦即是说, .name必定有着对应的情况。而且, 相关的一些内容将依据模块规格。模块同样是有了一些变动, 首先, 像上面所讲的那样, sys.path是有可能被更改的, sys.argv被更新成为了的值的时候, sys.被更新成为了正在被执行的模块的临时模块对象, 在函数返回之前, 对于中条目的所有改动都是会被恢复原样的。要留意, 和其它情形不一样的是, 此函数针对相关方面的改动并非无关紧要, 这是因为这些调整对于sys.path项能够顺利开展执行而言极为关键。鉴于仍旧存在线程安全的限定, 在线程代码里运用此函数的时候应该采用导入锁来进行序列运行, 或者将其委托给一个单独的进程。参见用于在命令行上实现同等功能 path/to/。在3.4版本进行了更改, 进行了更新, 目的是为了能够充分利用PEP 451所加入的模块规格功能, 在从有效sys.path项导入, 而不是直接执行的这种情况下, 能够实现正确设置。参见PEP 338 -- 将模块作为脚本执行PEP 由 Nick 撰写并实现。PEP 366 ——主模块的显式相对导入PEP 由 Nick 撰写并实现。PEP 451 —— 导入系统采用的 类型PEP 由 Eric Snow 撰写并实现。—— 命令行详解函数