我有一个广泛的程序正在我的服务器上运行。出现错误的行如下所示:
result[0].update(dictionary)
result[0]
看起来像("label",{key:value,...})
,所以我得到一个错误,说tuple
没有update
当我把它修正为result[0][1].update(dictionary)
时,我得到了同样的错误!
然后我添加了上面的print "test"
来查看发生了什么,得到了相同的错误,但它给出了print语句中发生的错误。这告诉我服务器正在运行的代码是原始代码,而不是经过编辑的代码。我尝试重新启动服务器。我已经保存了我的代码。我不明白为什么,也不明白这是怎么发生的。这可能是什么原因造成的,我如何才能使服务器识别新版本?
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/background_task/tasks.py", line 160, in run_task
tasks.run_task(task.task_name, args, kwargs) [2/1832]
File "/usr/local/lib/python2.7/dist-packages/background_task/tasks.py", line 45, in run_task
task.task_function(*args, **kwargs)
File "/.../proj/tasks.py", line 10, in automap_predict
automap_obj.predict()
File "/.../proj/models.py", line 317, in predict
prediction = predictions[1]
File "/.../proj/models.py", line 143, in predict
#this is a recursive call
File "/.../proj/models.py", line 143, in predict
#this is a recursive call
File "/.../proj/models.py", line 127, in predict
#result[0].update(dictionary) this happens at the base case of the recursion
AttributeError: 'tuple' object has no attribute 'update'
注意,我在一行注释掉了这个错误。显示这不是真正运行的代码。
def view(request,param):
run_background_task(param)
return redirect("project.view.reload")
@background(schedule=0)
def run_background_task(param):
obj = MyModel.objects.get(field=param)
obj.predict()
这就是创建result
的地方。我不允许显示此代码,但请注意,我确信实际代码与此无关。它起作用了。我把它改了,以便快速更新。我搞错了。然后我修正了错误,但得到了同样的错误。我甚至回到了旧版本,我仍然得到同样的错误。因此,此错误与此函数的内容无关。
如果我能帮上什么忙,请告诉我。
可能这就是你要找的吗?
此问题可能与已编译的python文件或位于服务器上项目文件夹中的“.pyc”文件有关。这些文件在解释python代码时自动生成。有时,即使存在新代码,并且它继续运行旧代码,也不会重新编译这些文件。
您可以通过pip安装“django extensions”,它附带了一个方便的manage.py命令,可以帮助您清除这些文件:
如果这不起作用,则需要重新启动运行代码的wsgi服务器,因为python代码在内存中。
如果运行的是django提供的开发服务器,即
./manage.py runserver
,则不应遇到此问题,因为它会在保存.py文件时自动重新编译。但是,如果您运行的是wsgi,那么说使用apache服务器是一个常见的问题,但是使用的是一个非常简单的解决方案。基本上,当您更改.py文件时,服务器仍将使用以前编译的python文件。所以解决方案是重新启动apachesudo service apache2 restart
(这是一个过度终止),或者只要运行touch wsgi.py
,只要wsgi.py位于项目中的任何位置,它就会告诉它重新编译.py文件。当然,您也可以删除.pyc文件,但这太繁琐了。编辑:
我只是注意到你在使用
@background
装饰器,这让我相信你在使用django-background-task。如果是这样的话,您必须确保这个应用程序也考虑到了您的代码更改,这在使用touch wsgi.py
方法重新编译python文件时可能不会自动发生。我没有使用这个特定应用程序的经验,但是例如celery,这是一个用于调度任务的更复杂的应用程序,您还必须重新启动worker以反映代码中的更改,因为worker实际上存储了一个pickled版本的代码。现在,在签出django-background-task应用程序(看起来像是您正在使用的应用程序)之后,理论上您不必做任何特殊的事情,只需确保您可以清除任何计划的任务并重新安排它们。我没有试过,但你应该可以通过
./manage.py shell
:可能您甚至需要清除数据库,对于
DBTaskRunner
:相关问题 更多 >
编程相关推荐