在Python中导入模块时出现段错误

4

我有一个使用自然语言日期解析器Natty的Python脚本。 Natty本身是用Java编写的,但使用Jpype包装以在Python中使用。该脚本在我的开发机器上运行良好,但在生产机器上会出现分段错误:

>>> import natty
Segmentation fault (core dumped)

在两台机器上,使用pip freeze命令,我得到了相关模块的相同版本。
...
JPype==0.5.4.2
JPype1==0.6.1
...
natty==0.2.4
...

我在两台机器上运行相同版本的Python。

>>> import sys
>>> print (sys.version)
2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609]

两台机器上,JAVA_HOME的值设置为相同的值。

>echo $JAVA_HOME
/usr/lib/jvm/java-8-oracle

简而言之,我无法发现任何明显的差异。我在这个Stackoverflow线程中找到了一些导致分段错误的原因,但并没有真正帮助我。我有点认为它是使用Jpype包装的Java代码,但这只是一个猜测。
我该如何追踪这个错误?
编辑: gdb python 给我以下输出
(gdb) run ~/tmp/natty-test.py
Starting program: /usr/bin/python ~/tmp/natty-test.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00007fffe48bf2b4 in ?? ()
(gdb) backtrace
#0  0x00007fffe48bf2b4 in ?? ()
#1  0x0000000000000246 in ?? ()
#2  0x00007fffe48bf160 in ?? ()
#3  0x00007ffff5901990 in VM_Operation::_names ()
   from /usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libjvm.so
#4  0x00007fffffffcf90 in ?? ()
#5  0x00007ffff543168d in VM_Version::get_processor_features() ()
   from /usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libjvm.so
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

natty-test.py 只包含 import natty 语句。


检查开发和生产环境中安装的依赖项是否相同。 - rkatkam
你能具体一点吗?Natty(Python包)只有两个依赖项,JPype1python-dateutil。这两个依赖项在两台机器上都是相同且最新的版本。或者你是指Natty JAR文件?当我检查https://github.com/joestelmach/natty/blob/master/pom.xml时,我看到了一些依赖项,但我不知道该如何继续进行。 - Christian
1个回答

1
解决方案:我必须在生产机上更新Ubuntu安装的内核。

我注意到Jpype已经引起了问题。

>>> import jpype  
>>> jpype.startJVM(jpype.getDefaultJVMPath())  
Segmentation fault

在寻找解决方案时,我找到了这个 Stackoverflow主题和包含的 AskUbuntu主题链接。生产机器上的内核版本为4.4.0-81-generic,这是其中提到的内核之一。更新到4.10.0-32-generic后,现在一切都正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接