2017-08-22 7 views
1

J'ai un script Python qui utilise l'analyseur de date en langage naturel Natty. Natty lui-même est écrit en Java mais enveloppé pour son utilisation en Python en utilisant Jpype. Le script fonctionne parfaitement bien sur ma machine de développement, mais renvoie une erreur de segmentation sur la machine de production:Erreur de segmentation lors de l'importation d'un module en Python

>>> import natty 
Segmentation fault (core dumped) 

Sur deux machines, en utilisant pip freeze je reçois la même version des modules pertinents:

... 
JPype==0.5.4.2 
JPype1==0.6.1 
... 
natty==0.2.4 
... 

sur les deux machines , je lance les mêmes versions de Python

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

machines, JAVA_HOME est réglé sur la même valeur

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

En bref, je ne peux pas repérer les différences évidentes. J'ai trouvé ce Stackoverflow thread qui énumère les causes des défauts de segmentation, mais cela ne m'a pas vraiment aidé. Je suppose que c'est un code Java enveloppé avec Jpype, mais c'est juste une supposition.

Comment puis-je rechercher cette erreur?

EDIT:gdb python me donne ce qui suit à mettre

(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 ne contient import natty

+0

La vérification des dépendances installées est la même sur le développement et la production. – rkatkam

+0

Pouvez-vous être un peu plus précis? Natty (paquet python) a seulement deux dépendances, 'JPype1' et' python-dateutil'. Les deux sont les mêmes et les dernières versions sur les deux machines. Ou référez-vous le fichier Natty JAR? Quand je vérifie [https://github.com/joestelmach/natty/blob/master/pom.xml](https://github.com/joestelmach/natty/blob/master/pom.xml) je vois un couple de dépendances, mais je ne sais pas comment procéder avec ça. – Christian

Répondre

0

Solution: je devais mettre à jour le noyau de mon installation Ubuntu sur la machine de production.

je remarquai que Jpype déjà causé le problème

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

la recherche de ce problème m'a amené à cette Stackoverflow thread et le lien inclus à un AskUbuntu thread. Le noyau sur la machine de production était 4.4.0-81-générique, un si les noyaux y étaient mentionnés. Après la mise à jour à 4.10.0-32-générique tout fonctionne bien maintenant.