如何在**Python 3.3+**中导入任意python源文件(其文件名可以包含任何字符,并且不总是以.py
结尾)?
我使用imp.load_module
如下:
>>> 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,而不是这个模块。
在Python 3.3+中加载任意Python源文件的正确方法是什么,而不使用已弃用的imp.load_module
函数?
5条答案
按热度按时间dgiusagp1#
从
importlib
测试代码中找到了解决方案。使用importlib.machinery.SourceFileLoader:
注意:仅适用于 Python 3.3+。
UPDATE
Loader.load_module
自Python 3.4起已弃用。使用Loader.exec_module
代替:z5btuh9x2#
Python >= 3.8更新:
简短版本:
完整版本:
Python 3.5和3.6的原始答案
@falsetru的解决方案的简短版本:
我用Python 3.5和3.6测试了它。
根据评论,它不适用于任意文件扩展名。
j8ag8udp3#
类似于@falsetru,但适用于Python 3.5+,并考虑了
importlib
文档中关于在types.ModuleType
上使用importlib.util.module_from_spec
的声明:此函数[
importlib.util.module_from_spec
]优于使用types.ModuleType
创建新模块,因为spec用于在模块上设置尽可能多的导入控制属性。我们可以通过修改
importlib.machinery.SOURCE_SUFFIXES
列表导入任何单独使用importlib
的文件。w80xi6nr4#
importlib
辅助函数这里有一个方便的、现成的帮助器来替换
imp
,并提供了一个示例。技术与https://stackoverflow.com/a/19011259/895245相同,这只是提供了更方便的功能。main.py
非主
运行:
输出:
我将
-
替换为_
,因为我的可导入Python可执行文件没有扩展名,与my-cmd
一样有连字符。这不是强制性的,但会产生更好的模块名称,如my_cmd
。此模式也在以下文档中提到:https://docs.python.org/3.7/library/importlib.html#importing-a-source-file-directly
我最终转向它,因为在更新到Python 3.7之后,
import imp
打印:我不知道该怎么关掉它,有人问我:
相关:
在Python 3.7.3中测试。
rpppsulh5#
在许多失败的解决方案之后,这一个对我有效
要调用它,只需写出函数名和它的参数
_import("function",*args)