我正在阅读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 np
。 model_params.py
与numpy
类似,import01
与np
类似。
我想问一下load_source
方法的第一个参数是做什么的? help(imp)
几乎没有提及load_source
方法,例如help(imp.load_source)
之后返回load_source(...)
由于
编辑基于behzad.nouri评论
在load_source的文档页面上说:
name参数用于创建或访问模块对象。
但是当我尝试访问module.name
时,我收到有关未定义模块的错误。也是为什么没有help
可以访问的文档,我能以某种方式安装它吗?我希望文档是python中代码本身的一部分,或者通常的做法是不内置它而是让它在线?
答案 0 :(得分:14)
official documentation有关于该主题的更多信息。
基本上,加载模块的名称将用于导入该模块的其他文件。即使python路径中的任何位置都没有module.name
模块,如果加载某个模块并为其指定名称,那么使用该名称执行常规import
的其他模块也不会引发错误并按预期工作。也许一个小例子可以更好地说明这一点:
value = 1337
from foo.bar import value
def print_val():
print value
import imp
foo = imp.load_source('foo.bar', '/tmp/test/foo.py')
import bar
bar.print_val()
正如预期的那样,您会在屏幕上显示1337
。如果名称不是foo.bar
,则导入将在bar.py
中失败,因为实际上不存在此类模块。
这种方法实际上可以用于猴子修补,因为它会覆盖第三方模块内的导入。
答案 1 :(得分:1)
imp.load_source(name,pathname [,file]):
加载并初始化作为Python源文件实现的模块并返回其模块对象。如果模块已经初始化,它将再次初始化。 name参数用于创建或访问模块对象。 pathname参数指向源文件。 file参数是源文件,从头开始打开以作为文本读取。它当前必须是真实的文件对象,而不是模拟文件的用户定义的类。请注意,如果存在正确匹配的字节编译文件(带后缀.pyc或.pyo),则将使用它而不是解析给定的源文件