为什么pickle会崩溃我的烧瓶服务器?

时间:2014-01-28 19:48:17

标签: python flask pickle

问题

当我尝试挑选一个简单的可拾取对象时,我正在运行一个崩溃的服务器。如果打开调试模式,服务器只会崩溃。如果我删除debug=True,服务器运行正常。当我将代码放入单个文件而不是包中时,我也无法复制错误。 Python 2.7和3.3都出现了这个问题。

收到'/'路径的get请求后,服务器崩溃。我没有得到任何关于出了什么问题或者发生了什么的反馈 - 浏览器页面就像挂载一样永远挂起。使用调试器运行程序没有帮助。

我怀疑,由于烧瓶自动重新加载模块的方式,pickle无法找到基类文件,但我不知道如何进一步探索这个想法。

守则

我的程序包结构如下:

MyServer
    __init__.py
runserver.py

__ INIT __ PY:

import pickle
import flask

app = flask.Flask(__name__)

class Test(object):
    def __init__(self, name):
        self.name = name

@app.route('/')
def show_front():
    o = Test('test')
    x = pickle.dumps(o)
    return x

app.run(debug=True)

runserver.py:

import MyServer

1 个答案:

答案 0 :(得分:2)

我使用hanging_threads来获取线程等待的位置。 这是许多人中的一条:

  File "C:\Python27\lib\subprocess.py", line 997, in wait
    _subprocess.INFINITE)

Flask启动一个新进程,等待并提供输出我猜。 但如果它开始一个新的过程暗示:

app.run(debug=True)

也在孩子身上执行。

解决方案:

  1. 如果导入,请不要启动应用。 app.run(debug=True) =>

    if __name__ == '__main__': app.run(debug=True)
    
  2. runserver.py更改为

    import MyServer
    MyServer.app.run(debug=True)
    
  3. 然后我得到了这个输出:

    ccopy_reg _reconstructor p0 (cMyServer Test p1 c__builtin__ object p2 Ntp3 Rp4 (dp5 S'name' p6 S'test' p7 sb.