首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >导入任意python源文件。(Python 3.3+)

导入任意python源文件。(Python 3.3+)
EN

Stack Overflow用户
提问于 2018-09-19 04:56:02
回答 2查看 0关注 0票数 0

如何.pyPython 3.3+中导入任意python源文件(其文件名可能包含任何字符,并不总是以其结尾)?

我使用imp.load_module如下:

代码语言:javascript
复制
>>> import imp
>>> path = '/tmp/a-b.txt'
>>> with open(path, 'U') as f:
...     mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))
...
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>

它仍然适用于Python 3.3,但根据imp.load_module文档,它已被弃用:

从版本3.3开始不推荐使用:不需要加载器应该用于加载模块,并且不推荐使用find_module()。

imp模块文档建议使用importlib

注意新程序应使用importlib而不是此模块。

在不使用已弃用的imp.load_module函数的情况下,在Python 3.3+中加载任意python源文件的正确方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2018-09-19 13:53:02

importlib测试代码中找到解决方案。

使用importlib.machinery.SourceFileLoader

代码语言:javascript
复制
>>> import importlib.machinery
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> mod = loader.load_module()
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>

注意:仅适用于Python 3.3+

Loader.load_module自Python 3.4起,不推荐使用UPDATELoader.exec_module改为使用:

代码语言:javascript
复制
>>> import types
>>> import importlib.machinery
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> mod = types.ModuleType(loader.name)
>>> loader.exec_module(mod)
>>> mod
<module 'a_b'>
代码语言:javascript
复制
>>> import importlib.machinery
>>> import importlib.util
>>> loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')
>>> spec = importlib.util.spec_from_loader(loader.name, loader)
>>> mod = importlib.util.module_from_spec(spec)
>>> loader.exec_module(mod)
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
票数 0
EN

Stack Overflow用户

发布于 2018-09-19 14:22:07

更短版本的@falsetrue解决方案:

代码语言:javascript
复制
>>> import importlib.util
>>> spec = importlib.util.spec_from_file_location('a_b', '/tmp/a-b.py')
>>> mod = importlib.util.module_from_spec(spec)
>>> spec.loader.exec_module(mod)
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>

我用Python 3.5和3.6测试了它。

根据评论,它不适用于任意文件扩展名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档