【发布时间】:2017-07-21 09:34:59
【问题描述】:
我正在尝试用 Python 构建一个小型构建系统,为我的 C++ 项目生成 Ninja 文件。它的行为应该类似于 CMake;也就是说,bldfile.py 脚本定义规则和目标,并通过调用bld.subdir() 选择性地递归到一个或多个目录。每个bldfile.py 脚本都有一个对应的bld.File 对象。当bldfile.py 脚本正在执行时,bld 全局应该被预定义为该文件的bld.File 实例,但只能在该模块的范围内。
此外,我想以某种方式利用 Python 的字节码缓存,但 .pyc 文件应存储在构建输出目录中,而不是与 bldfile.py 脚本一起存储在 __pycache__ 目录中。
我知道我应该使用importlib(需要 Python 3.4+ 就可以了),但我不知道如何:
- 使用自定义全局变量加载并执行模块文件。
- 重用字节码缓存基础设施。
任何帮助将不胜感激!
【问题讨论】:
-
也许我误解了你,但 Python 的“全局变量”实际上已经是模块范围的 - 每个脚本的
bld全局变量将自动不同(除非他们从另一个模块显式导入它,或者存储它进入另一个模块)。 -
我想通了,但我不是一个 Python 程序员,所以我只是想明确这个要求,以防它对答案有任何影响。
-
如果说自定义全局变量,是不是要在导入模块前设置好?
-
@kazemakase 是的,我希望它们在模块代码执行时可用。
-
@DavidBrown 我不认为这是可能的,但看看有人如何证明我错了会很有趣。当然有更简单的方法来实现您想要的功能,而无需入侵导入。例如,您可以在导入完成后执行所有工作的模块中定义入口函数。关于
__pycache__,我认为是hard-coded,尽管定义似乎没有使用。现在无法详细说明进口问题的答案;明天再来看看。
标签: python python-module python-importlib