Embedded Python,Builtin-Module "posix" integrieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo zusammen, ich weiß nicht ob ich hier an der richtigen Adresse mit meinem Problem bin
aber ich werd's trotzdem mal versuchen.

Ich portiere zZt den Pythoninterpreter auf ein embedded System.
Der Status ist der, dass ich mir ein "minimales" Python zusammengebaut habe (Python-Sourcen 2.5),
in welchem nur die essentiell benötigten sourcen mitcompiliert wurden.
Auch der Dateizugriff über einen selbstgeschrieben Wrapper auf das Flash-File-System ist erfolgreich.
(open,close,read,write, import ...)

Das soweit als Hintergrund, nun aber zu meinem Problem:
Ich würde an dieser Stelle gerne das module os.py importieren können.

jetziger Stand :

Code: Alles auswählen

'import site' failed; use -v for traceback # schlägt im Detail wegen import os.py fehl
Welcome to my embedded Python!!
>>> import os
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "os.py", line 131, in <module>
    raise ImportError, 'no os specific module found'
ImportError: no os specific module found
>>>
Ich habe festgestellt das in os.py zu beginn nach vorhandenen Builtin-Modules gesucht wird.

Auszug aus os.py:

Code: Alles auswählen

_names = sys.builtin_module_names

...

if 'posix' in _names:
    name = 'posix'
    linesep = '\n'
    from posix import *
meine builtins sind zZt sehr mager ;) :

Code: Alles auswählen

>>> import sys
>>> sys.builtin_module_names
()
>>>
Ich gehe zwar davon aus das ich aufgrund meines Filesystems einige Details ändern bzw. wrappen muss,
aber ich würde an der Stelle halt gerne das Modul Posix in meinem interpreter mit einbinden.
(Oder hat jemand einen besseren Vorschlag? )

Weiß jemand vielleicht wie das geht?
Ich habe schon die ganze Doku auf den Kopf gestellt,
finde aber nur das einbinden eines in C geschriebenen Moduls mit

Code: Alles auswählen

Example:
Py_InitModule("emb",EmbMethods); 
Das ist aber nicht das richtige, oder?!

Muss ich zum einbinden in der pyconfig.h ein bestimmtes define setzen?
Handelt es sich bei Modules/posixmodule.c um das gesuchte Sourcefile welches ich compilieren und als builtin-module einbinden muss ?
Wenn ja, wie? ;)

Just for Info: Die main() für meinen Interpreter ist ebenfalls minimal...

Code: Alles auswählen

  ...
  Py_Initialize();

  printf("Welcome to my embedded Python!!\n");
  PyRun_InteractiveLoop(stdin,"<stdin>");

    /* Exit, cleaning up the interpreter */
  Py_Exit(0);
  ...
Wenn ihr noch weitere code-snippets braucht reiche ich die gerne nach.
Vielen Dank im voraus
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Nun sicherlich musst du 'os.py' anpassen um dein system erkennen lassen.
Was für ein OS nutzt denn dein embedded sys?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ich gehe auch davon aus das ich die os.py anpassen muss.
Was mich halt an der Stelle wundert wo sich ein "normales" Python die
sys.builtin_module_names herholt. Die werden ja nicht durch ein import geholt. (hab ich zumindest das gefühl)

Das OS ist eCos aber halt mit nem eigenen FlashFile System auf das ich das os.py und vielleicht auch das posix-modul anpassen muss.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hm. Kann es sein, das dein Betriebssystem posix kompatibel ist, aber Python das einfach nicht erkennt???

Was ist, wenn du in os.py statt:
_names = sys.builtin_module_names einfach ein _names = "posix" machst???

Was bringt ein print sys.builtin_module_names ?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

jens hat geschrieben:Hm. Kann es sein, das dein Betriebssystem posix kompatibel ist, aber Python das einfach nicht erkennt???
Erkennen tut Python von sich aus garnichts. Er übernimmt nur die Informationen die beim configure in der pyconfig.h eingetragen werden.
Ich habe Python komplett "von Hand" compiliert also nicht über configure-make. Sondern über ein eigenes sCons-Script mit einer einer "minimalen" pyconfig.h . Ich habe nur leider kein #define oder eine C-Funktion gefunden mit welcher ich das laden von posixmodule.c in die builtins einleiten kann. Ich vermute, wenn mir das gelingt wird posix in den builtin_modules enthalten sein.
jens hat geschrieben:Was ist, wenn du in os.py statt:
_names = sys.builtin_module_names einfach ein _names = "posix" machst???
Dann geht python dazu über ein import posix machen zu wollen, aber da das ja zZt nicht vorhanden ist ( und posix auch als .py module nicht existiert ) kommt python an der Stelle natürlich auch nicht weiter.
jens hat geschrieben:Was bringt ein print sys.builtin_module_names ?
Zap hat geschrieben:meine builtins sind zZt sehr mager :
Code: (Python)

Code: Alles auswählen

>>> import sys
>>> sys.builtin_module_names
()
>>> 
Naja ich werde mal weiter recherchieren.
Danke schonmal ;)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dumme Frage: Warum existiert denn die posix.py nicht?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hehe, es gibt keine dummen fragen.
Man kann ja auch module direkt in C schreiben anstatt in python.
Man muss es halt nur mit dem Pythoninterpreter mitcompilieren.
Und so "scheint" es bei dem posix-modul zu sein.
Es gibt zumindest in den sourcen nur eine posixmodule.c aber keine posix.py

Hier ein Beispiel aus Extend-Embedd-Docs von Python wie ein Modul in C aussieht:

Code: Alles auswählen

static int numargs=0;
/* Return the number of arguments of the application command line */
static PyObject*
emb_numargs(PyObject *self, PyObject *args)
{
if(!PyArg_ParseTuple(args, ":numargs"))
return NULL;
return Py_BuildValue("i", numargs);
}
static PyMethodDef EmbMethods[] = {
{"numargs", emb_numargs, METH_VARARGS,
"Return the number of arguments received by the process."},
{NULL, NULL, 0, NULL}
};

/* Insert the above code just above the main() function. Also, insert the following two statements directly after Py_-
Initialize(): */

numargs = argc;
Py_InitModule("emb", EmbMethods);
Die Methode ist nur leider nicht für meinen Zweck geeignet da das Modul so nicht in den builtins landet...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ah, sorry, ich hab posix mir posixpath verwechselt. Das ist ein pure Python Skript...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ich hab die Lösung gefunden.
Habe mir hierzu einen Compiliervorgang unter Linux angeguckt und herausgefunden das im Ordner Modules eine datei config.c angelegt wird in welcher die builtin_modules definiert werden.

Ich brauchte also nur das:

config.c

Code: Alles auswählen

struct _inittab _PyImport_Inittab[] = {
        
        {"posix", initposix},
        {0, 0}
};
Antworten