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

2024-04-21Python开发问题
8

本文介绍了导入任意 python 源文件.(Python 3.3+)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

我使用 imp.load_module 如下:

>>>进口小鬼>>>路径 = '/tmp/a-b.txt'>>>使用 open(path, 'U') 作为 f:... mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))...>>>模组<来自'/tmp/a-b.txt'的模块'a_b'>

它在 Python 3.3 中仍然有效,但根据 imp.load_module 文档,它已被弃用:

<块引用>

自 3.3 版起已弃用:不需要,因为应该使用加载器加载模块和 find_module() 已弃用.

imp模块文档推荐使用importlib:

<块引用>

注意新程序应该使用 importlib 而不是这个模块.

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

解决方案

importlib 测试代码.

使用 importlib.machinery.SourceFileLoader:

>>>导入 importlib.machinery>>>loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')>>>mod = loader.load_module()>>>模组<来自'/tmp/a-b.txt'的模块'a_b'>

注意:仅适用于Python 3.3+.

更新 Loader.load_module 自 Python 3.4 起已弃用.使用 Loader.exec_module 改为:

>>>导入类型>>>导入 importlib.machinery>>>loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')>>>mod = types.ModuleType(loader.name)>>>loader.exec_module(mod)>>>模组<模块'a_b'>

<小时>

>>>导入 importlib.machinery>>>导入 importlib.util>>>loader = importlib.machinery.SourceFileLoader('a_b', '/tmp/a-b.txt')>>>规格 = importlib.util.spec_from_loader(loader.name, loader)>>>mod = importlib.util.module_from_spec(spec)>>>loader.exec_module(mod)>>>模组<来自'/tmp/a-b.txt'的模块'a_b'>

How can I import an arbitrary python source file (whose filename could contain any characters, and does not always ends with .py) in Python 3.3+?

I used imp.load_module as follows:

>>> 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'>

It still works in Python 3.3, but according to imp.load_module documentation, it is deprecated:

Deprecated since version 3.3: Unneeded as loaders should be used to load modules and find_module() is deprecated.

and imp module documentation recommends to use importlib:

Note New programs should use importlib rather than this module.

What is the proper way to load an arbitrary python source file in Python 3.3+ without using the deprecated imp.load_module function?

解决方案

Found a solution from importlib test code.

Using importlib.machinery.SourceFileLoader:

>>> 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'>

NOTE: only works in Python 3.3+.

UPDATE Loader.load_module is deprecated since Python 3.4. Use Loader.exec_module instead:

>>> 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'>


>>> 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'>

这篇关于导入任意 python 源文件.(Python 3.3+)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

在xarray中按单个维度的多个坐标分组
groupby multiple coords along a single dimension in xarray(在xarray中按单个维度的多个坐标分组)...
2024-08-22 Python开发问题
15

Pandas中的GROUP BY AND SUM不丢失列
Group by and Sum in Pandas without losing columns(Pandas中的GROUP BY AND SUM不丢失列)...
2024-08-22 Python开发问题
17

GROUP BY+新列+基于条件的前一行抓取值
Group by + New Column + Grab value former row based on conditionals(GROUP BY+新列+基于条件的前一行抓取值)...
2024-08-22 Python开发问题
18

PANDA中的Groupby算法和插值算法
Groupby and interpolate in Pandas(PANDA中的Groupby算法和插值算法)...
2024-08-22 Python开发问题
11

PANAS-基于列对行进行分组,并将NaN替换为非空值
Pandas - Group Rows based on a column and replace NaN with non-null values(PANAS-基于列对行进行分组,并将NaN替换为非空值)...
2024-08-22 Python开发问题
10

按10分钟间隔对 pandas 数据帧进行分组
Grouping pandas DataFrame by 10 minute intervals(按10分钟间隔对 pandas 数据帧进行分组)...
2024-08-22 Python开发问题
11