繁体   English   中英

与从Django本地运行python脚本后进行清理

[英]Cleaning up after a python script has been run locally vs from Django

编辑:当我在帖子中说“全局变量”时,我指的是mtcbody脚本; Django代码不使用全局变量。

我有一个相当神秘的问题; 我有一个python脚本,可以接收XML文件,对其进行解析并返回某种结果。 该脚本具有一些用于执行其工作的全局变量。 当我在本地运行此脚本时(例如,从eclipse开始),这些全局变量和所有其他内容最后都会自动销毁,并且新运行将使用新资源(如预期的那样)。

但是,当我从Django视图运行此脚本时,我期望得到相同的行为,但是,此脚本会保留全局变量,并在每次发出请求时将其添加到它们。

这是从eclipse在本地运行的示例:

import mtcbody

def doShit():
    context = {}
    result = mtcbody.getData()

    # the variable result['tvas_after'] is one of the global variables in the mtcbody script
    print 'TVAs after: ' + str(result['tvas_after'])

    return context

if __name__ == '__main__':
    doShit()

以及第一次运行后的结果:

TVAs after: {'1': <mtcbody.TVA instance at 0x7f28011aac20>}

第二次运行后的结果:

TVAs after: {'1': <mtcbody.TVA instance at 0x7f94bbb96c20>}

第三次运行后的结果:

TVAs after: {'1': <mtcbody.TVA instance at 0x7f9509f49c20>}

如您所见,在每次运行期间,从头开始重新填充保存TVA实例的字典。 现在,将其与从django视图运行相同脚本时得到的行为进行比较:

def index(request):
    context = RequestContext(request)
    result = mtcbody.getData()

    print 'TVAs after: ' + str(result['tvas_after'])

    return render(request, 'dashboardbase/table.html', context)

第一次刷新后的结果(请求)

TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>}

第二次刷新后的结果(请求)

TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>, '2': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff066e4afc8>}

第三次刷新后的结果(请求)

TVAs after: {'1': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0850fb488>, '3': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff0a1fa4ea8>, '2': <multitvaconfig.mtc.mtcbody.TVA instance at 0x7ff066e4afc8>}

如您所见,脚本的变量在Django视图调用之间被保留。 有人可以解释这种现象,如果可能的话,如何避免它,并使它看起来像在本地运行一样。

谢谢

我不知道为什么您很难解释这种行为。 脚本运行一次然后退出,但是服务器应用程序是持久的,因此全局数据在该应用程序中是持久的也就不足为奇了。

解决方案应该显而易见:不要使用全局变量。 他们很少有帮助,但在奇数的情况下,当真正想要的数据调用之间持续存在。 特别是在服务器环境中,不同的用户可能在不同的时间请求资源,全局变量很危险。 在您的情况下,很难看到mtcbody的相关功能,因此很难建议,但是似乎您应该通过类传递该模块中的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM