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