执行前将本地注入动态加载的模块

时间:2012-07-03 15:21:06

标签: python

我正在尝试在python中构建一种脚本系统,允许在运行时在python中选择和执行小段代码。

基本上我希望能够加载像

这样的小python文件
for i in Foo: #not in a function.
    print i

在程序的其他地方我指定Foo将会是什么。好像Foo作为整个加载的python文件的函数参数而不是单个函数

所以其他地方

FooToPass = GetAFoo ()
TempModule = __import__ ("TheSnippit",<Somehow put {'Foo' : FooToPass} in the locals>)

1 个答案:

答案 0 :(得分:2)

在模块级别使代码具有副作用被认为是不好的风格。如果您希望模块执行某些操作,请将该代码放在函数中,使Foo成为此函数的参数,并使用所需的值调用它。

Python的导入机制不允许预初始化模块名称空间。如果你想要这样做(在我看来,这是令人困惑和不必要的),你必须摆弄进口机制的细节。示例实现(未经测试):

import imp
import sys

def my_import(module_name, globals):
    if module_name in sys.modules:
        return sys.modules[module_name]
    module = imp.new_module(module_name)
    vars(module).update(globals)
    f, module.__file__, options = imp.find_module(module_name)
    exec f.read() in vars(module)
    f.close()
    sys.modules[module_name] = module
    return module