导入/执行一个模块并从父模块调用函数



我试图从我的django应用程序调用外部python脚本。我想从外部python脚本中的父模块调用一个函数。我尝试了以下方法。

  1. 使用子流程。call:在这种情况下,我不能使用父文件中的函数。目标函数使用Django模型来做一些数据库操作。

  2. 导入外部文件:我尝试使用 Import ()导入外部文件,但我无法访问父模块中定义的函数。

示例代码:
from app.models import x
def save():
    print x.objects.all()    
def do_stuff():
    subprocess.call('external_script')

#----------External script --------
''' some code here '''
#Calling save function from parent 
save()

我如何实现这一点?

如果你有权限编辑外部模块,并从中调用一些函数,而不仅仅是导入,你可以从第一个模块传递一个回调:

def save():
    pass # do something here
def execute_external_module():
    from external_module import some_function
    some_function(save)

def some_function(callback=None):
    # do something here
    if callback is not None:
        callback()

模块不知道它被导入到哪里,具体来说,模块的全局变量是在导入时新创建的。因此,如果导入器不合作,被导入的模块就永远不能接触位于导入器命名空间中的对象。如果一个模块需要调用父模块命名空间中的函数,父模块必须将该函数传递给该模块。具体:

#child
def do_stuff(parents_function):
    pass

#parent
def func():
    pass
import child
child.do_stuff(func)

然而,由于缓存,模块并不是完全隔离的。因此,如果你知道父模块的名称,你可以这样做:

#child
import parent
def do_stuff():
    parent.func()

#parent
import child
def func():
    pass
child.do_stuff()

最新更新