从父模块导入/执行模块和调用函数

时间:2015-09-23 22:29:34

标签: python django python-2.7

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

  1. 使用subprocess.call:在这种情况下,我无法使用父文件中的函数。目标函数使用Django模型进行一些数据库操作。

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

  3. 示例代码:

    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()
    

    我如何实现这一目标?

2 个答案:

答案 0 :(得分:4)

如果您有权编辑该外部模块并且从中调用某个功能,而不仅仅是导入该功能,则可以从第一个模块传递回调:

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()

答案 1 :(得分:2)

模块不知道导入的位置,具体而言,模块的全局是在导入时新创建的。因此,如果导入器不合作,则导入的模块永远不会触及位于导入器命名空间中的对象。如果模块需要在父级命名空间中调用函数,则其父级必须将该函数传递给模块。具体地:

#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()