2015-03-18 12 views
5

Das ist so ziemlich wie this question, aber die gegebene Lösung dort (Aufruf freeze_support()) funktioniert nicht für mich.Python 3.4 Multiprocessing funktioniert nicht mit py2exe

Ich habe das folgende Skript namens start.py, das ich verwende, um eine eigenständige ausführbare Datei mit py2exe (Version 0.9.2.2) zu erstellen. Ich habe auch python.exe im selben Verzeichnis.

import multiprocessing 

def main(): 
    print('Parent') 
    p = multiprocessing.Process(target=new_process) 
    multiprocessing.set_executable('python.exe') 
    p.start() 
    p.join() 

def new_process(): 
    print('Child') 

if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    main() 

Es funktioniert einwandfrei, wenn als Python ausgeführt. Wenn sie jedoch als eine ausführbare Datei verpackt, das ist der Fehler, den ich bekommen:

Unknown option: -- 
usage: <path to start.exe> [option] ... [-c cmd | -m mod | file | -] [arg] ... 
Try `python -h' for more information. 

Diese eindeutig durch den Aufruf

python.exe --multiprocessing-fork 

verursacht Wenn ich nicht set_executable() aufrufen und freeze_support(), die Der untergeordnete Prozess startet die exe einfach und läuft als __main__, wodurch eine endlose Kette neuer Prozesse entsteht, um "Parent" zu drucken, während "Child" nie gedruckt wird.

Das einzige, was Aufruf freeze_support() das Kind Prozess zu tun scheint, ist zu verursachen den folgenden Fehler zu erhöhen, wenn ich multiprocessing.set_executable nicht nennen()

Traceback (most recent call last): 
    File "start.py", line 17, in <module> 
    multiprocessing.freeze_support() 
    File "C:\Python34\Lib\multiprocessing\context.py", line 148, in freeze_support 

    freeze_support() 
    File "C:\Python34\Lib\multiprocessing\spawn.py", line 67, in freeze_support 
    main() 
NameError: name 'main' is not defined 

Ich verwende Python 3.4 32- Bit läuft unter Windows 8.1 64 Bit. Ich habe alles oben mit cx-Freeze mit den gleichen Ergebnissen versucht. Jede Hilfe würde sehr geschätzt werden.

EDIT: Auch wenn Sie dieses Beispiel mit straight out of the docs:

from multiprocessing import Process, freeze_support 

def f(): 
    print('hello world!') 

if __name__ == '__main__': 
    freeze_support() 
    Process(target=f).start() 

ich den gleichen Nameerror erhalten, wenn das Kind Prozess freeze_support() aufruft.

+0

Mein Werkzeug [pynsist] (http://pynsist.readthedocs.org/en/latest/) könnte nützlich sein. Es macht Ihren Code nicht zu einer exe, Sie sollten also keine speziellen Tricks benötigen, um Multiprocessing zu betreiben. Es erstellt ein Installationsprogramm, das Python selbst zusammen mit Ihrem Code einrichtet. –

+0

Ich konnte es mit Python 2.7.9 und py2exe 0.6.9 arbeiten lassen, vorausgesetzt, ich habe den Aufruf von set_executable entfernt, aber immer noch freeze_support() aufgerufen. Meine beste Vermutung ist, dass freeze_support() in Python 3 nicht richtig funktioniert. – Mobious

Antwort

2

Versuchen Sie, den vorgeschlagenen fix in the docs:

multiprocessing.set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe')) 

Beachten Sie auch, dass Sie diese vor Laichen alle neuen Prozesse aufrufen müssen.

+0

Das gibt mir das gleiche Ergebnis wie das, was ich gerade habe. Ich habe versucht, set_executable vor der Initialisierung des Prozesses zu verschieben, und unter If \ __ name__ == '\ __ main__' vor und nach dem Aufruf von freeze_support(), alles ohne Erfolg. – Mobious

+1

Nur eine weitere Sache zu beachten: sys.exec_prefix ist eigentlich eine leere Zeichenfolge in der gepackten ausführbaren Datei. Wenn ich die python.exe nicht in das Arbeitsverzeichnis einschließen würde, würde ich einen FileNotFoundError bekommen, da Multiprocessing die python.exe nicht finden kann. – Mobious

+0

Ich hatte genau dieses Problem. Anstatt "python.exe" zu verwenden, sollten Sie 'pythonw.exe' verwenden, das scheinbar' Unbekannte Option: --' zu lösen scheint – Jonathan