我试图从我的django应用程序调用外部python脚本。我想从外部python脚本中的父模块调用一个函数。我尝试了以下方法。
-
使用子流程。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()
我如何实现这一点?
如果你有权限编辑外部模块,并从中调用一些函数,而不仅仅是导入,你可以从第一个模块传递一个回调:
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()