Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python 3.4 multiprocessing does not work with py2exe

This is pretty much the same as this question, but the given solution there (calling freeze_support()) does not work for me.

I have the following script called start.py that I use to build a standalone executable with py2exe (version 0.9.2.2). I also have python.exe in the same directory.

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

It works perfectly fine when run as pure python. However, when packaged as an executable, this is the error I get:

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

This is clearly caused by calling

python.exe --multiprocessing-fork

If I don't call set_executable() and freeze_support(), the child process just starts up the exe and runs as __main__, causing an endless chain of new processes to print "Parent" while "Child" is never printed.

The only thing calling freeze_support() seems to do is cause the child process to raise the following error if I don't call 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

I'm using Python 3.4 32-bit running on Windows 8.1 64 bit. I've tried everything above using cx-Freeze with the same results. Any help would be much appreciated.

EDIT: Even when using this example 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()

I get the same NameError when the child process calls freeze_support().

like image 309
Mobious Avatar asked Oct 31 '22 08:10

Mobious


1 Answers

Try the suggested fix in the docs:

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

Also note that you need to call this before spawning any new processes.

like image 196
Patrick Collins Avatar answered Nov 15 '22 04:11

Patrick Collins