2015-03-18 19 views
5

Jest to prawie takie samo jak this question, ale podane tam rozwiązanie (wywołanie freeze_support()) nie działa dla mnie.Python 3.4 multiprocessing nie działa z py2exe

Mam następujący skrypt o nazwie start.py, którego używam do budowania samodzielnego pliku wykonywalnego z py2exe (wersja 0.9.2.2). Mam również python.exe w tym samym katalogu.

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() 

Działa doskonale, gdy działa jako czysty python. Jednak, gdy są pakowane jako plik wykonywalny, to jest to błąd otrzymuję:

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

ta jest wyraźnie spowodowane przez wywołanie

python.exe --multiprocessing-fork 

Gdybym nie nazywają set_executable() i freeze_support(), przy czym proces potomny uruchamia exe i działa jako __main__, powodując niekończący się łańcuch nowych procesów drukowania "Parent", a "Child" nigdy nie jest drukowany.

Jedyne nazywając freeze_support() wydaje się zrobić to powodować proces dziecko podnieść następujący komunikat o błędzie, jeśli nie nazwać multiprocessing.set_executable()

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 

Używam Python 3.4 32- bit działający w systemie Windows 8.1 w wersji 64-bitowej. Próbowałem wszystkiego powyżej używając cx-Freeze z tymi samymi wynikami. Każda pomoc byłaby bardzo cenna.

EDIT: Nawet podczas korzystania z tego przykładu 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() 

uzyskać ten sam NameError gdy proces dziecko nazywa freeze_support().

+0

Moje narzędzie [pynsist] (http://pynsist.readthedocs.org/en/latest/) może być przydatne. To nie sprawia, że ​​twój kod jest exe, więc nie powinieneś potrzebować żadnych specjalnych sztuczek, aby zrobić pracę wieloprocesową. Tworzy instalator, który konfiguruje sam Python wraz z kodem. –

+0

Udało mi się uruchomić go przy użyciu Pythona 2.7.9 i py2exe 0.6.9 pod warunkiem, że usunąłem wywołanie funkcji set_executable, ale nadal nazywam freeze_support(). Domyślam się, że freeze_support() nie działa poprawnie w Pythonie 3. – Mobious

Odpowiedz

2

Spróbuj zaproponowaną poprawkę in the docs:

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

Należy również zauważyć, że trzeba zadzwonić to przed tarła nowych procesów.

+0

To daje mi ten sam rezultat, co obecnie. Próbowałem przenieść set_executable do przed inicjalizacją procesu, a poniżej, jeśli \ __ name__ == '\ __ main__' zarówno przed jak i po wywołaniu freeze_support(), wszystko bez skutku. – Mobious

+1

Kolejna sprawa do zapamiętania: sys.exec_prefix jest w rzeczywistości pustym ciągiem w spakowanym pliku wykonywalnym. Gdybym nie zawarł pliku python.exe w katalogu roboczym, otrzymywałbym FileNotFoundError, ponieważ proces wieloprocesowy nie może znaleźć pliku python.exe. – Mobious

+0

Miałem ten dokładny problem. Zamiast używać 'python.exe' powinieneś używać' pythonw.exe', który wydaje się rozwiązywać 'Nieznana opcja: --' – Jonathan

Powiązane problemy