我正在读这个关于从绝对路径导入模块的问题.答案建议使用以下代码:
import imp
foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()
Run Code Online (Sandbox Code Playgroud)
我想从具有以下结构的dir导入文件(它是包):
__int__.py
model_params.py
Run Code Online (Sandbox Code Playgroud)
我这样做了:
import01 = imp.load_source('module.name', '/home/wakatana/experiments/model_params/model_params.py')
Run Code Online (Sandbox Code Playgroud)
现在我可以访问model_params.py
via中的变量了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中代码本身的一部分,或者通常的做法是不内置它而是让它在线?
Ano*_*ous 17
该官方文档对主题的更多一点的信息.
基本上,加载模块的名称将用于导入该模块的其他文件.即使module.name
python路径中的任何位置都没有模块,如果加载某个模块并为其命名,那么import
使用该名称定期执行的其他模块也不会引发错误并按预期工作.也许一个小例子会更好地说明这一点:
value = 1337
Run Code Online (Sandbox Code Playgroud)
from foo.bar import value
def print_val():
print value
Run Code Online (Sandbox Code Playgroud)
import imp
foo = imp.load_source('foo.bar', '/tmp/test/foo.py')
import bar
bar.print_val()
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,您将被1337
打印到屏幕上.如果名称不是foo.bar
,则导入将失败,bar.py
因为实际上不存在此类模块.
这种方法实际上可以用于猴子补丁,因为它会覆盖第三方模块内的导入.