我正在尝试从我的django应用程序调用外部python脚本。我想从外部python脚本中的父模块调用一个函数。我尝试了以下方法。
使用subprocess.call:在这种情况下,我无法使用父文件中的函数。目标函数使用Django模型进行一些数据库操作。
导入外部文件:我尝试使用 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()
我如何实现这一目标?
答案 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()