[Python-de] pyfromc, python23.zip und Threads

Gerson Kurz gerson.kurz at pergamon-software.de
Don Okt 30 09:23:43 CET 2003


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?

-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde geschreddert...
Dateiname   : pyfromc.zip
Dateityp    : application/x-zip-compressed
Dateigröße  : 8330 bytes
Beschreibung: nicht verfügbar
URL         : http://starship.python.net/pipermail/python-de/attachments/20031030/910130c2/pyfromc.bin