Minimal Python -> import httplib -> OverflowError: mat

Probleme bei der Installation?
Antworten
schlangenmaus
User
Beiträge: 3
Registriert: Montag 7. Dezember 2009, 14:29

Hallo,

Ich möchte auf einem "embedded" Linux einen minimalen python Interpreter installieren.

Das Debian-Paket http://packages.debian.org/lenny/python2.5-minimal liefert einen entsprechenden vorkomplilierten Python Interpreter und scheint dazu geeignet:

Jetzt habe ich jedoch ein schwerwiegendes Problem:
Beim Import von httplib verabschiedet sich python mit einem Segmentation Fault:
[root@40-xxx-240]:/home/test # python
Python 2.5.4 (r254:67916, Sep 26 2009, 08:19:36)
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import httplib
Segmentation fault
[root@40-xxx-240]:/home/test #
Andere Libraries (sys, time, re etc.) lassen sich importieren. An was könnte das liegen? Ich bin dankbar für sämtliche Hinweise...

Nachtrag 7.12.09 19:00:

Ich konnte das Problem weiter eingränzen. Inzwischen bekomme ich keine Segmentation Faulst, da ich die .py Files von meinem Computer auf das embedded Device kopiert habe.

Wenn ich nun ein

Code: Alles auswählen

import httplib
ausführe, bekomme ich folgende Exception:
Traceback (most recent call last):
File "./test.py", line 2, in <module>
import httplib
File "/usr/lib/python2.5/httplib.py", line 70, in <module>
import mimetools
File "/usr/lib/python2.5/mimetools.py", line 6, in <module>
import tempfile
File "/usr/lib/python2.5/tempfile.py", line 33, in <module>
from random import Random as _Random
File "/usr/lib/python2.5/random.py", line 55, in <module>
NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
OverflowError: math range error
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/apport_python_hook.py", line 38, in apport_excepthook
File "/usr/lib/python2.5/site-packages/apport/__init__.py", line 1, in <module>
File "/usr/lib/python2.5/site-packages/apport/report.py", line 14, in <module>
File "/usr/lib/python2.5/tempfile.py", line 33, in <module>
from random import Random as _Random
File "/usr/lib/python2.5/random.py", line 55, in <module>
NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
OverflowError: math range error

Original exception was:
Traceback (most recent call last):
File "./test.py", line 2, in <module>
import httplib
File "/usr/lib/python2.5/httplib.py", line 70, in <module>
import mimetools
File "/usr/lib/python2.5/mimetools.py", line 6, in <module>
import tempfile
File "/usr/lib/python2.5/tempfile.py", line 33, in <module>
from random import Random as _Random
File "/usr/lib/python2.5/random.py", line 55, in <module>
NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0)
OverflowError: math range error

Wo könnte das Problem liegen?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Was ist es denn für ein embedded Linux?
Ist es den ein Debian Lenny?
schlangenmaus
User
Beiträge: 3
Registriert: Montag 7. Dezember 2009, 14:29

Hallo,

Nein, es handelt sich um ein BusyBox-Linux. Kernel 2.6.28.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Versuch doch mal ob das läuft:
http://packages.ubuntu.com/jaunty/python-minimal

Ubuntu 9.04 hat wenigsten die gleiche Kernelversion, aber glibc solltest du auch mal überprüfen ob das die gleichen Versionen sind.

Ansonsten musst du es am besten genau für dein embedded system builden.
schlangenmaus
User
Beiträge: 3
Registriert: Montag 7. Dezember 2009, 14:29

Hallo,

Danke für die Tips.

Ich habe Python für das embedded Device selber kompiliert

Code: Alles auswählen

CFLAGS="-O2 -march=i486" ./configure --host=i486-linux-gnu --build=i486-linux-gnu --with-libc=../glibc-build/libc.so --disable-ipv6 --prefix=/usr/ && make clean && make
Mit libc Version 2.7 konnte ich python2.5 nicht kompilieren. Mti glibc Version 2.9 hat's schlussendlich geklappt. Nun bin ich mir nicht ganz sicher, welche libc Python auf dem Device verwendet. Wie kann ich das kontrollieren?

bzw. wo kann ich nachlesen welche Python Version mit welcher libc Version kompiliert werden kann.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

schlangenmaus hat geschrieben:...
Nun bin ich mir nicht ganz sicher, welche libc Python auf dem Device verwendet. Wie kann ich das kontrollieren?
Die libc-Datei ist direkt ausführbar und spuckt Versionsdaten aus:

Code: Alles auswählen

#> ldd /usr/bin/python
        linux-gate.so.1 =>  (0xffffe000)
        libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0 (0xb7e2b000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7e11000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7e0c000)
        libutil.so.1 => /lib/libutil.so.1 (0xb7e08000)
        libm.so.6 => /lib/libm.so.6 (0xb7ddf000)
        libc.so.6 => /lib/libc.so.6 (0xb7c83000) <-----Pfad zur libc
        /lib/ld-linux.so.2 (0xb7fbd000)
#> /lib/libc.so.6
GNU C Library stable release version 2.9 (20081117), by Roland McGrath et al.
..usw..
Wenn das nicht funktioniert, kannst Du auch mit einem kleinen C-Schnipsel die Versionsnummer auslesen, includes und Linker mußt Du entsprechend Deiner libc anpassen:

Code: Alles auswählen

#include <gnu/libc-version.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("libc-version: %s\n", gnu_get_libc_version());
    printf("libc-release: %s\n", gnu_get_libc_release());
    return 0;
}
Hast Du denn jetzt mehrere glibc-Versionen nebeneinander installiert? Prinzipiell geht das, Du mußt dann allerdings bei zusätzlichen Abhängigkeiten aufpassen (z.B. C-Module für Python). Keine Ahnung, inwieweit die mitgelieferte libc noch an das embedded device angepaßt wurde, evtl. warten da noch mehr Probleme mit einer eigenen Standard-libc-Version auf Dich. (sollte aber eigentlich auf Kernelebene abgehandelt sein)
Antworten