Seite 1 von 2
c python und numpy
Verfasst: Mittwoch 6. Januar 2010, 15:31
von mk1x86
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!
Verfasst: Mittwoch 6. Januar 2010, 15:44
von theliquidwave
Keine Ahnung, aber vielleicht mal TESTWEISE den Reference decrement count weglassen oder Py_Finalize. Nur TESTWEISE.
Gruß
Verfasst: Mittwoch 6. Januar 2010, 15:55
von mk1x86
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.
Verfasst: Mittwoch 6. Januar 2010, 16:05
von Darii
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.
Verfasst: Mittwoch 6. Januar 2010, 16:22
von mk1x86
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?
Verfasst: Mittwoch 6. Januar 2010, 16:50
von HWK
Verfasst: Mittwoch 6. Januar 2010, 16:59
von mk1x86
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.
Verfasst: Mittwoch 6. Januar 2010, 17:21
von HWK
"Printe" doch mal das Ergebnis von PySys_GetPath.
MfG
HWK
Verfasst: Mittwoch 6. Januar 2010, 17:26
von mk1x86
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.
Verfasst: Donnerstag 7. Januar 2010, 10:42
von CM
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
Verfasst: Donnerstag 7. Januar 2010, 13:25
von HWK
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
Verfasst: Donnerstag 7. Januar 2010, 15:24
von CM
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

.
Verfasst: Donnerstag 7. Januar 2010, 17:34
von mk1x86
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.
Verfasst: Donnerstag 7. Januar 2010, 17:35
von Trundle
`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.
Verfasst: Donnerstag 7. Januar 2010, 19:30
von HWK
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
Verfasst: Donnerstag 7. Januar 2010, 19:37
von Trundle
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.
Verfasst: Freitag 8. Januar 2010, 17:05
von mk1x86
Aber eine Lösung des Problems gibt es nicht? Irgendwie muss das doch lösbar sein
Verfasst: Freitag 8. Januar 2010, 19:06
von Darii
Da ich zufällig gerade auch Python embedden musste, ich habe mir einfach damit beholfen, den Pythonpfad entsprechend zu setzen.
Verfasst: Freitag 8. Januar 2010, 19:30
von HWK
@mk1x86: Zeig doch mal den Rückgabewert von GetPath vor und nach SetPath.
MfG
HWK
Verfasst: Samstag 9. Januar 2010, 01:13
von Trundle
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?