c python und numpy

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.
mk1x86
User
Beiträge: 7
Registriert: Mittwoch 6. Januar 2010, 15:23

Hallo, ich arbeite an einem Institut, dass Videokompression entwickelt, d.h. Weiterentwicklung des derzeitigen HVC/264 Standards. Ich möchte gerne verschiedene Matrizen innerhalb eines C-Programmes austauschen, ohne dabei jedesmal alles neu kompilieren zu müssen.

Code: Alles auswählen

#include <Python.h>
#include <stdio.h>

main(int argc, char *argv[])
{
 Py_Initialize();

 char *path, *newpath;
 path=Py_GetPath();
 newpath=(char*)malloc((strlen(path)+44)*sizeof(char));
 strcpy(newpath, path);
 strcat(newpath, ":.:/usr/lib/python2.5/site-packages/Numeric"); // ":." for unix, or ";." for windows
 PySys_SetPath(newpath);
 free(newpath);

 PyObject* modul2 = PyImport_ImportModule("numpy");
 if(modul2 == 0)
 {
   printf("-----\n");
 }
/*
 PyObject* modul = PyImport_ImportModule("coeff");

   if(modul == 0)
   {
   printf("Could not import coefficient module\n");
   Py_Finalize();
   return 0;
   }
   PyObject* funk = PyObject_GetAttrString(modul, "calcCoeff8x8");
   PyObject* ret = PyObject_CallObject(funk,0);

   int i;
   for(i = 0; i < 1; ++i)
       printf("%f\n", PyFloat_AsDouble(PyTuple_GetItem(ret,i)));

   Py_DECREF(ret);
   Py_DECREF(funk);

 Py_DECREF(modul);
*/
 Py_DECREF(modul2);
 Py_Finalize();
 return 0;
} 
[/code]

Dies ist ein Testprogramm, wie ihr seht, ist eine Menge auskommentiert. Mein Modul coeff.py ist im gleichen Ordner wie die binary und beinhaltet derzeit nur:

Code: Alles auswählen

try:
  from numpy import *
except:
  print "no numpy available"
Und tatsächlich: exception raise. Der Witz dabei ist, dass Numpy existiert. Wenn ich den python-Interpreter so aufrufe und coeff.py ausführe, wird das Modul gefunden.

Hat wer eine Idee, woran das liegen könnte?

Vielen Dank für eure Hilfe!
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Keine Ahnung, aber vielleicht mal TESTWEISE den Reference decrement count weglassen oder Py_Finalize. Nur TESTWEISE.

Gruß
Grüßle.
mk1x86
User
Beiträge: 7
Registriert: Mittwoch 6. Januar 2010, 15:23

Das ändert nichts. Oh und Zeile 16 steht eigentlich nicht "numpy", sondern "coeff" (coeff.py ist Datei mit dem Pythoncode unten).

ich würde nur gerne wissen, was an numpy anders ist als an math oder sys oder os oder irgendeinem anderen Modul.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

mk1x86 hat geschrieben:ich würde nur gerne wissen, was an numpy anders ist als an math oder sys oder os oder irgendeinem anderen Modul.
Naja math, sys etc. sind Module der Standardbibliothek, die findet er immer. Ich vermute mal, dass du da noch irgendwie die Pfad zu numpy setzen musst. Ich tippe mal, dass du dir mit PySys_SetPath da einiges zerschießt. Lass das doch mal weg.
mk1x86
User
Beiträge: 7
Registriert: Mittwoch 6. Januar 2010, 15:23

Es ist tatsächlich was mit dem Pfad, wenn ich ihn rausnehme, kann ich numpy importieren, ABER: ich brauche noch coeff.py, welches in meinem cwd ist und da komme ich nicht ran, ohne sys.path zu ändern. Die Idee des Codes war eigentlich, die alten Pfade zu erhalten und meinen (also ".") hinzuzufügen. Vielleicht habe ich da was falsch gemacht?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Hilft das?
MfG
HWK
mk1x86
User
Beiträge: 7
Registriert: Mittwoch 6. Januar 2010, 15:23

Leider nein, denn ich benutze 2.5

Ich habe auch mal folgendes probiert:

Code: Alles auswählen

Py_Initialize();
char* path = Py_GetPath();
PySys_SetPath(path);
PyObject* modul = PyImport_ImportModule("numpy");
if(modul == 0)
  printf("no numpy\n");
Py_Finalize();
Zeile 2 und 3 sollten ja vermeintlich keine Änderung bewirken, tuen sie allerdings. Ich bin also leicht verwirrt.
Irgendwie gibt es da keine logische Erklärung dafür, auße SetPath und GetPath arbeiten nicht wirklich gleich.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

"Printe" doch mal das Ergebnis von PySys_GetPath.
MfG
HWK
mk1x86
User
Beiträge: 7
Registriert: Mittwoch 6. Januar 2010, 15:23

Hab ich schon, ist absolut okay. Ich hab auch nach dem Code da nochmal getPath gemacht, der war absolut identisch. Trotzdem geht numpy nicht mehr.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hast Du vielleicht andere Pythonversionen? Wird auf die site-packages einer anderen Version verlinkt? (ungewöhnlich, aber möglich) Liegt wirklich alles unter /usr/lib/...?

Heißt Dein numpy-Ordner vielleicht "numpy" und nicht "Numeric"? (bei mir der Fall)

Wozu überhaupt die PATH-Manipulation? Wenn pure-Python numpy findet, sollte das ein C-Modul doch auch tun?

Nur mal so ein paar Ideen ins Blaue geschossen ...

HTH
Christian
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

CM hat geschrieben:Wozu überhaupt die PATH-Manipulation? Wenn pure-Python numpy findet, sollte das ein C-Modul doch auch tun?
mk1x86 hat geschrieben:Die Idee des Codes war eigentlich, die alten Pfade zu erhalten und meinen (also ".") hinzuzufügen.
MfG
HWK
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ja, bin ich blind oder passiert in der kritischen Zeile doch mehr? In meinen Augen wird noch ein zusätzlicher Pfad drangehangen und das irritiert mich eben. Von daher meine Frage - vielleicht überflüssig, aber lieber zuviel gefragt, als nachher die Antwort nicht gefunden, weil sich jemand nicht getraut hat dumm zu fragen ;-).
mk1x86
User
Beiträge: 7
Registriert: Mittwoch 6. Januar 2010, 15:23

Also ich möchte mein eigenes Modul laden, das liegt im working directory. Da dieses aber nicht im PATH drin ist, muss ich es hinzufügen.
Numpy wird importiert (ist auch in Numeric), wenn ich PATH NICHT ÄNDERE. Sobald ich ihn ändere (ob jetzt was drangehangen oder nicht), kann ich Numpy nicht mehr importiert. Interessanterweise konnte Numpy auch nicht mehr importiert werden, nachdem ich lediglich PySys_SetPath(Py_GetPath()); ausführte, was ich dann doch reichlich seltsam finde.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

`Py_GetPath()` gibt wirklich nur ein paar wenige Default-Pfade zurück. Beim Initialisieren von Python wird aber auch das Modul [mod]site[/mod] geladen und erst das hängt das site-packages-Verzeichnis an `sys.path` an. Nach dem Starten steht in `sys.path` also viel mehr, als `Py_GetPath()` zurückgibt, und `PySys_SetPath` überschreibt dann eben `sys.path` mit den "zu wenigen" Pfaden.

Das gleiche Verhalten kann man sehen, wenn man einfach einmal Python mit dem Parameter "-S" startet (dann wird das site-Modul nicht geladen). Dann wird numpy auch nicht gefunden.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Wird das Initialisieren, d.h. u.a. das Importieren von Site aber nicht in Py_Initialize durchgeführt? Dann müsste Py_GetPath ja den vollständigen Pfad zurückliefern.
MfG
HWK
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Warum sollte es? Das, was `Py_GetPath` zurückgibt, ist *nicht* `sys.path`.

Edit: Wobei die Dokumentation das natürlich ein wenig suggeriert, das ist wohl etwas unglücklich.

Edit: Jetzt nicht mehr.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
mk1x86
User
Beiträge: 7
Registriert: Mittwoch 6. Januar 2010, 15:23

Aber eine Lösung des Problems gibt es nicht? Irgendwie muss das doch lösbar sein
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Da ich zufällig gerade auch Python embedden musste, ich habe mir einfach damit beholfen, den Pythonpfad entsprechend zu setzen.

Code: Alles auswählen

PYTHONPATH="." ./Programm
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@mk1x86: Zeig doch mal den Rückgabewert von GetPath vor und nach SetPath.
MfG
HWK
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Da gibt es nichts zu zeigen. `Py_GetPath()` gibt bei jedem Aufruf das gleiche zurück wie beim vorigen Aufruf.

Warum benutzt der OP nicht einfach `PySys_SetArgv` oder manipuliert `sys.path` direkt?
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Antworten