Hallo Leute,
ich brauch mal wieder eure Hilfe :-/
Ich arbeite gerade an einem Pythonprojekt, verwendet wird Python 3.4.3
so wie PyQt5, jeweils in der 64bit version. Das Executable wird mit
cx-freeze erstellt. Ein Executable ist notwendig, da nicht überall
Python und PyQt installiert werden soll!
Um das Problem für euch besser greifbar zu machen, habe ich mal ein
minimal Beispiel angehangen.
Das Beispiel ist eine einfache GUI mit 2 Knöpfen, der Eine startet 3
Prozesse (die in diesem Beispiel nichts machen außer 30 sekunden
schlafen), der andere Knopf beendet die Prozesse und schließt die GUI.
Ich verwende hier multiprocessing, und kein threading!
Das Problem:
Unter Windows werden nicht die Prozesse gestartet, dafür wird die GUI
multiple male neu erzeugt. Unter Linux lässt sich dieses Verhalten
reproduzieren, wenn man die standard methode zum erzeugen von prozessen
auf 'spawn' stellt, 'spawn' ist die standard-methode unter windows,
'fork' kann windows nicht. Nutzt man unter Linux 'fork' als
standard-methode, so tritt dieses verhalten nicht auf. Das Beispiel ist
so angepasst, dass auch unter Linux 'spawn' als standard-methode genutzt
wird, zu finden in main.py
1 | MP.set_start_method('spawn')
|
Das Problem tritt nur auf, wenn man das Executable nutzt, führt man
das script direkt aus, so tritt das problem nicht auf.
Das Beispiel enthält ein setup-script um das executable zu erzeugen
Das script erzeugt einen Ordner namens 'build', dort ist das executable
zu finden.
Das verhalten kann ich unter Linux (Kernel 4.2) sowie unter Windows 7
und Windows 10 reproduzieren.
Habt ihr eine Idee weshabl die GUI bei drücken des Knopfes mehrfach
erzeugt wird, und wie man das löst? :-/
Grüße