
Ich experimentiere mit der Interaktion zwischen Python und C++ Code. Das ganze gliedert sich in zwei Bereiche: - Realisierung der Interaktion Python<>C++. Im Anhang findest du den kompletten Sourcecode für pyfromc, ein C++ Programm, das Python aufruft (guckst du "pyfromc.py") und umgekehrt von Python aus C++ (guckst du das eingebaute cfrompy-Modul in pyfromc.cpp). (Windows-Only derzeit, brauchst du DevStudio6 ) - Verpackung für den Setup. Ich habe es geschafft, den Pythoncode dann soweit abzuspecken, daß mein Setup einen (unkomprimierten) Overhead von 1.5 mb hat, um pyfromc auszuliefern. Das ist akzeptabel (im Vergleich zu den mehr als 9 mb des "richtigen" Installers. Ich denke, das ist auch für andere interessant; deshalb bin ich dabei, eine Doku dafür zu schreiben & werde sie dann auf meine Webseite stellen. Ich habe noch folgende Probleme: 1) Seit 2.3 kann ich Module aus python23.zip importieren. Das Zipferl wird allerdings in dem Pfad gesucht, in dem die python23.dll liegt. Fallbeispiel a: ich installiere python23.zip und python23.dll in c:\foo auf einem leeren System -> python23.zip wird korrekt angezogen Fallbeispiel b: ich installiere python23.zip und python23.dll in c:\foo auf meinem Entwicklerpc -> python23.zip wird in \winnt\system32 gesucht, weil da die python23.dll liegt. Die entsprechende Stelle im Python-Quellcode ist pc\getpathp.c, Zeile 465++ /* Calculate zip archive path */ if (dllpath[0]) /* use name of python DLL */ strncpy(zip_path, dllpath, MAXPATHLEN); else /* use name of executable program */ strncpy(zip_path, progpath, MAXPATHLEN); d.h. ich sehe auch nicht, wie man da einfach was umlenken kann. Ich möchte möglichst alle module (z.b. auch os) aus dem Zipferl laden, das aber an einer speziellen Stelle liegen soll; das Problem ist, daß ich das vor Py_Initialize() einstellen müsste... 2) THREADS! Ich feiere im C++ Programm wilde Threadorgien; diese sollen den Code aufrufen dürfen. a) wenn ich nix mache, stürzt python ab (klar, keine Threadsynchronisation, die muß ich leisten). b) wenn ich den Aufruf wrappe wie folgt: PyGILState_STATE s = PyGILState_Ensure(); pyValue = PyObject_CallObject(m_pyFunc, m_pyArgs); PyGILState_Release(s); geht gar nix (alle threads bleiben hängen). c) wie mächte ich es richtig? Soll ich einfach auf meiner C++ Seite alle Aufrufe in 'ne globale Semaphore stecken? Das kann es doch nicht wirklich sein, oder? _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

"Gerson Kurz" <gerson.kurz@pergamon-software.de> writes:
1) Seit 2.3 kann ich Module aus python23.zip importieren. Das Zipferl wird allerdings in dem Pfad gesucht, in dem die python23.dll liegt.
Fallbeispiel a: ich installiere python23.zip und python23.dll in c:\foo auf einem leeren System -> python23.zip wird korrekt angezogen
Fallbeispiel b: ich installiere python23.zip und python23.dll in c:\foo auf meinem Entwicklerpc -> python23.zip wird in \winnt\system32 gesucht, weil da die python23.dll liegt.
Die entsprechende Stelle im Python-Quellcode ist pc\getpathp.c, Zeile 465++
/* Calculate zip archive path */ if (dllpath[0]) /* use name of python DLL */ strncpy(zip_path, dllpath, MAXPATHLEN); else /* use name of executable program */ strncpy(zip_path, progpath, MAXPATHLEN);
d.h. ich sehe auch nicht, wie man da einfach was umlenken kann. Ich möchte möglichst alle module (z.b. auch os) aus dem Zipferl laden, das aber an einer speziellen Stelle liegen soll; das Problem ist, daß ich das vor Py_Initialize() einstellen müsste...
Sieh Dir den Quellcode zu py2exe (in CVS, im sandbox Subdirectory) an, dann siehst Du wie es geht. (Hint: PYTHONPATH setzen bevor Py_Initialize aufgerufen wird). Thomas _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (2)
-
Gerson Kurz
-
Thomas Heller