imp.load_source方法的第一个参数是做什么的?

时间:2015-08-02 15:16:10

标签: python module

我正在阅读this关于从绝对路径导入模块的问题。答案建议使用以下代码:

import imp
foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()

我想从具有以下结构的dir导入文件(它是包):

__int__.py
model_params.py

我做到了这一点:

import01 = imp.load_source('module.name', '/home/wakatana/experiments/model_params/model_params.py')

现在我可以通过model_params.py访问import01.VARIABLE_NAME中的变量了。它似乎等同于import numpy as npmodel_params.pynumpy类似,import01np类似。

我想问一下load_source方法的第一个参数是做什么的? help(imp)几乎没有提及load_source方法,例如help(imp.load_source)之后返回load_source(...)

由于

编辑基于behzad.nouri评论

load_source的文档页面上说:

  

name参数用于创建或访问模块对象。

但是当我尝试访问module.name时,我收到有关未定义模块的错误。也是为什么没有help可以访问的文档,我能以某种方式安装它吗?我希望文档是python中代码本身的一部分,或者通常的做法是不内置它而是让它在线?

2 个答案:

答案 0 :(得分:14)

official documentation有关于该主题的更多信息。

基本上,加载模块的名称将用于导入该模块的其他文件。即使python路径中的任何位置都没有module.name模块,如果加载某个模块并为其指定名称,那么使用该名称执行常规import的其他模块也不会引发错误并按预期工作。也许一个小例子可以更好地说明这一点:

/tmp/test/foo.py

value = 1337

/tmp/test/bar.py

from foo.bar import value

def print_val():
    print value

/tmp/test/run.py

import imp
foo = imp.load_source('foo.bar', '/tmp/test/foo.py')

import bar

bar.print_val()

正如预期的那样,您会在屏幕上显示1337。如果名称不是foo.bar,则导入将在bar.py中失败,因为实际上不存在此类模块。

这种方法实际上可以用于猴子修补,因为它会覆盖第三方模块内的导入。

答案 1 :(得分:1)

From documentation

  

imp.load_source(name,pathname [,file]):

     

加载并初始化作为Python源文件实现的模块并返回其模块对象。如果模块已经初始化,它将再次初始化。 name参数用于创建或访问模块对象。 pathname参数指向源文件。 file参数是源文件,从头开始打开以作为文本读取。它当前必须是真实的文件对象,而不是模拟文件的用户定义的类。请注意,如果存在正确匹配的字节编译文件(带后缀.pyc或.pyo),则将使用它而不是解析给定的源文件