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