从Django本地运行python脚本后的清理

从Django本地运行python脚本后的清理,python,django,garbage-collection,persistence,Python,Django,Garbage Collection,Persistence,编辑:当我在帖子中说“全局变量”时,我指的是mtcbody脚本;django代码不使用全局变量 我有一个相当神秘的问题;我有一个python脚本,它接收XML文件,解析它并返回某种结果。此脚本有一些全局变量,用于执行其任务。当我在本地运行这个脚本时,例如从eclipse运行,这些全局变量和其他所有内容都会在最后自动销毁,新的运行会使用新的资源(如预期的那样) 然而,当我从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之后:{'1':}
第二次刷新后的结果(请求)

TVAs之后:{'1':,'2':}
第三次刷新后的结果(请求)

TVAs之后:{'1':,'3':,'2':}
如您所见,脚本中的变量在调用Django视图之间被保留。有人能解释一下这种行为吗?如果可能的话,如何避免这种行为,使其表现得像在本地运行一样


谢谢你

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


解决方案应该是显而易见的:不要使用全局变量。它们很少有帮助,除非您确实希望数据在调用之间保持不变。特别是在服务器环境中,不同的用户可以在不同的时间请求资源,全局变量是危险的。在您的例子中,如果没有看到
mtcbody
中的相关函数,很难给出建议,但您似乎应该在该模块中传递数据,可能是通过类。

mtcbody是否在其中使用全局变量?是的,当我在帖子中说“全局变量”时,我指的是mtcbody脚本。我的Django代码没有使用任何全局变量。我一发布这个问题就意识到我的天真,尽管你的回答很有帮助。mtcbody脚本很长(5000行),不久前由其他人作为一个独立的本地程序编写,我的任务是通过web提供它的功能。mtcbody很大程度上依赖于全局变量,除非进行完整的重构,否则无法摆脱它。
TVAs after: {'1': <mtcbody.TVA instance at 0x7f94bbb96c20>}
TVAs after: {'1': <mtcbody.TVA instance at 0x7f9509f49c20>}
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>}