python - 将任意命名的文件导入为 Python 模块,而不生成字节码文件

标签 python unit-testing

Python 程序如何轻松地从具有任意名称的文件中导入 Python 模块

标准库导入机制似乎没有帮助。一个重要的约束是我不希望出现伴随的字节码文件;如果我在名为 foo 的源文件上使用 imp.load_module,则会出现一个名为 fooc 的文件,该文件困惑且令人困惑。

Python 导入机制期望它最了解文件名:模块文件在特定的文件系统位置找到,特别是文件名具有特定的后缀(foo.py 对于 Python 源代码代码等),没有其他。

这与另一个约定冲突,至少在 Unix 上:将作为命令执行的文件应该是 named without reference to the implementation language .例如,执行“foo”的命令应该在名为 foo 的没有后缀的程序文件中。

但是,对这样的程序文件进行单元测试需要导入该文件。我需要程序文件中的对象作为 Python 模块对象,准备好在单元测试用例中进行操作,就像 import 给我的一样。

导入模块的Pythonic 方法是什么,尤其是从名称不以.py 结尾的文件没有出现字节码文件 用于该导入?

最佳答案

import os
import imp

py_source_open_mode = "U"
py_source_description = (".py", py_source_open_mode, imp.PY_SOURCE)

module_filepath = "foo/bar/baz"
module_name = os.path.basename(module_filepath)
with open(module_filepath, py_source_open_mode) as module_file:
    foo_module = imp.load_module(
            module_name, module_file, module_filepath, py_source_description)

关于python - 将任意命名的文件导入为 Python 模块,而不生成字节码文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6811902/

相关文章:

unit-testing - 运行使用 "Cannot use setInterval from within an async zone test"调用 setTimeout 错误的 Angular2 测试

unit-testing - 运行单个Grails单元/集成测试将在Intellij上运行所有测试

javascript - 是否可以同时将 Jest 与多个预设一起使用?

python - Python 2.x 中循环迭代的 Deferred_output

python - 像 PyCharm/Spyder 一样自动将项目添加到 VS Code 中的 sys.path 吗?

ruby-on-rails - 使用特定的 RAILS_ENV 进行单个单元测试

unit-testing - Visual Studio 2017 中未发现单元测试

python - 如何使用多个路由文件组织一个蓝图

python - 如何将法语单词转换为整数?

Python MySQLdb 意外行为(?)