PyInstaller: multiprocessing ведёт себя странно

Код:

from multiprocessing import Process

def test():
    print("b")

if __name__ == "__main__":
    print("a")
    p = Process(target=test)
    p.start()

Когда я запускаю скрипт через python, всё работает правильно: программа пишет a, затем b. Но когда я компилирую его через pyinstaller (вот так: python -m PyInstaller --onefile why.py), то программа пишет всё время букву a.

Как это исправить?

Python: 3.10.5

PyInstaller: 5.1

ОС: Windows 10 x64


Ответы (1 шт):

Автор решения: vlHelllsius

Тут уже ответили на это: ссылка

Вкратце: Если вы планируете использовать --onedir, все, что вам нужно будет добавить, — это вызов специального метода:

P.s (Весь код взят из ссылки сверху)

if __name__ == '__main__':
    # On Windows calling this function is necessary.
    multiprocessing.freeze_support()

Если вы планируете использовать --onefile, то необходимо добавить код:

import multiprocessing.forking
import os
import sys

class _Popen(multiprocessing.forking.Popen):
    def __init__(self, *args, **kw):
        if hasattr(sys, 'frozen'):
            # We have to set original _MEIPASS2 value from sys._MEIPASS
            # to get --onefile mode working.
            os.putenv('_MEIPASS2', sys._MEIPASS)
        try:
            super(_Popen, self).__init__(*args, **kw)
        finally:
            if hasattr(sys, 'frozen'):
                # On some platforms (e.g. AIX) 'os.unsetenv()' is not
                # available. In those cases we cannot delete the variable
                # but only set it to the empty string. The bootloader
                # can handle this case.
                if hasattr(os, 'unsetenv'):
                    os.unsetenv('_MEIPASS2')
                else:
                    os.putenv('_MEIPASS2', '')

class Process(multiprocessing.Process):
    _Popen = _Popen

# ...

if __name__ == '__main__':
    # On Windows calling this function is necessary.
    multiprocessing.freeze_support()

    # Use your new Process class instead of multiprocessing.Process
→ Ссылка