如何根据Python的完整路径在Python 3.4中加载Python模块?
类似的问题How to import a module given the full path?涵盖了3.4之前的Python版本,但结论是Python 3.4中的支持不适用于所提出的答案,因此感谢Python 3.4的任何解决方案。
请注意,此问题与Import abitrary python source file. (Python 3.3+)不重复,因为此问题的答案也使用了{3.4}中弃用的loader.load_module()
,如answer中所述,详情请参阅Consider leaving importlib.abc.Loader.load_module() 3}}和importlib中的文档。
因此需要在Python 3.4中通过完整路径导入模块的支持解决方案。
答案 0 :(得分:16)
这适用于所有python文件,无论文件扩展名如何:
import importlib.machinery
modulename = importlib.machinery.SourceFileLoader('modulename','/Path/To/module.py').load_module()
imp.load_module
documentation中的弃用邮件中提到了此方法。
答案 1 :(得分:5)
已经给出的答案有效,但不必要地笨拙。一种更简单的方法:
import sys, os, importlib
sys.path.append(os.path.dirname(filename))
mname = os.path.splitext(os.path.basename(filename))[0]
imported = importlib.import_module(mname)
sys.path.pop()
imported
是导入的模块;您可以通过imported.method(arg)
正常使用它。最后一行并不是绝对必要的,但是不要在sys.path
中留下不必要的条目更清楚(特别是如果你要多次运行代码)。这适用于3.4,并且不使用标记为已弃用的任何内容。
答案 2 :(得分:5)
根据3.6 docs支持和不弃用的方法是这样的:
def import_file(full_name, path):
"""Import a python module from a path. 3.4+ only.
Does not call sys.modules[full_name] = path
"""
from importlib import util
spec = util.spec_from_file_location(full_name, path)
mod = util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
答案 3 :(得分:1)
下面的函数在Python 3.4中有效 - 它用于在模块中加载和运行特定的函数,但是你需要将文件夹添加到sys路径。
sys.path.append("path_to_your_file_to_import")
tool = {'file':'test_tool.py',
'function':'sum_even_numbers',
'args':['list'],
'return':['int']
}
args = [1,2,3]
def run(tool, args, silent='Y'):
if silent == 'N':
print('main called ' + tool['file'] + '->' + tool['function'] + ' with ', args, ' = ', tool['return'])
mod = __import__( os.path.basename(tool['file']).split('.')[0])
func = getattr(mod, tool['function'])
tool['return'] = func(args)
return tool['return']
通过
进行调用run(tool, args)