gpt4 book ai didi

python - 如何使用 importlib 加载带有自定义全局变量的 Python 模块?

转载 作者:太空宇宙 更新时间:2023-11-04 02:55:25 32 4
gpt4 key购买 nike

我正在尝试用 Python 构建一个小型构建系统,为我的 C++ 项目生成 Ninja 文件。它的行为应该类似于CMake;也就是说,bldfile.py 脚本定义了规则和目标,并可选择通过调用 bld.subdir() 递归到一个或多个目录中。每个 bldfile.py 脚本都有一个对应的 bld.File 对象。当 bldfile.py 脚本执行时,bld 全局变量应该预定义为该文件的 bld.File 实例,但仅在该模块的范围

此外,我想以某种方式利用 Python 的字节码缓存,但是 .pyc 文件应该存储在构建输出目录中,而不是 __pycache__ 目录中与 bldfile.py 脚本一起。

我知道我应该使用 importlib(需要 Python 3.4+ 就可以),但我不确定如何:

  1. 加载并执行带有自定义全局变量的模块文件。
  2. 重新使用字节码缓存基础设施。

如有任何帮助,我们将不胜感激!

最佳答案

在执行之前将全局变量注入(inject)模块是一个有趣的想法。但是,我认为它与 Zen of Python 的几点冲突。 .特别是,它需要在模块中编写依赖于未明确定义、导入或以其他方式获取的全局值的代码 - 除非您知道调用模块所需的特定过程。

对于特定的用例,这可能是一个显而易见或巧妙的解决方案,但它不是很直观。一般来说,(Python)代码应该是显式的。因此,我会寻求一种将参数显式传递给执行代码的解决方案。听起来像函数?右:

bldfile.py

def exec(bld):
print('Working with bld:', bld)
# ...

调用模块:

# set bld

# Option 1: static import
import bldfile
bldfile.exec(bld)

# Option 2: dynamic import if bldfile.py is located dynamically
import importlib.util
spec = importlib.util.spec_from_file_location("unique_name", "subdir/subsubdir/bldfile.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
module.exec(bld)

这样在导入模块时不会执行任何代码(除了函数定义)。 exec 函数需要被显式调用,当查看 exec 中的代码时,很明显 bld 来自哪里。

关于python - 如何使用 importlib 加载带有自定义全局变量的 Python 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42542214/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com