【发布时间】:2011-10-29 23:48:54
【问题描述】:
以下代码导致 Java 出现段错误:
import os.path
import neo4j
from paste import httpserver, fileapp
import tempfile
from webob.dec import wsgify
from webob import Response, Request
HOST = '127.0.0.1'
PORT = 8080
class DebugApp(object):
@wsgify
def __call__(self, req):
# db = neo4j.GraphDatabase(tempfile.mkdtemp())
db = neo4j.GraphDatabase(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data'))
return Response(body='it worked')
def main():
app = DebugApp()
httpserver.serve(app, host=HOST, port=PORT)
if __name__ == '__main__':
main()
要重现,首先将该代码保存到文件中(例如 app.py),然后运行 python app.py。然后在浏览器中尝试http://localhost:8080;您应该会看到 Java 崩溃处理程序。
Java 堆栈跟踪的顶部如下所示:
Stack: [0xb42e7000,0xb4ae8000], sp=0xb4ae44f0, free space=8181k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [_jpype.so+0x26497] JPJavaEnv::NewObjectA(_jclass*, _jmethodID*, jvalue*)+0x37
C [_jpype.so+0x3c0e8] JPMethodOverload::invokeConstructor(_jclass*, std::vector<HostRef*, std::allocator<HostRef*> >&)+0x178
C [_jpype.so+0x3a417] JPMethod::invokeConstructor(std::vector<HostRef*, std::allocator<HostRef*> >&)+0x47
C [_jpype.so+0x1beba] JPClass::newInstance(std::vector<HostRef*, std::allocator<HostRef*> >&)+0x2a
C [_jpype.so+0x67b9c] PyJPClass::newClassInstance(_object*, _object*)+0xfc
C [python+0x96822] PyEval_EvalFrameEx+0x4332
C [python+0x991e7] PyEval_EvalCodeEx+0x127
我相信那是 Python 中的 neo4j.GraphDatabase 触发 JPype 在 Java 下的 neo4j 中寻找 EmbeddedGraphDatabase。
在交互式 Python 会话中运行此代码不会出现段错误:
>>> import webob
>>> import app
>>> debug_app = app.DebugApp()
>>> response = debug_app(webob.Request.blank('/'))
>>> response.body
'it worked'
大概是因为我在该示例中完全避免粘贴。也许这与 Paste 使用线程妨碍 neo4j 的方式有关?我在 neo4j 论坛中注意到了一个类似的问题:http://neo4j-community-discussions.438527.n3.nabble.com/Neo4j-CPython-Pylons-and-threading-td942435.html
...但这只发生在关机时。
【问题讨论】:
-
你在使用新的 Python 绑定吗,信息在这里:docs.neo4j.org/chunked/snapshot/python-embedded.html ?
-
是的,这些是我正在使用的绑定。