Я пытаюсь сделать исполняемый файл моего python скрипта с помощью Pyinstaller. Я использую:
PyInstaller: 3,6
Python: 3,7,7
Windows 10 64 бит
Когда я запускаю свой скрипт из Windows командный терминал, работает нормально. Когда я запускаю исполняемый файл, созданный Pyinstaller , на терминале показывается эта ошибка:
Process SpawnProcess-4:
Traceback (most recent call last):
File "multiprocessing\process.py", line 297, in _bootstrap
File "multiprocessing\process.py", line 99, in run
File "concurrent\futures\process.py", line 233, in _process_worker
File "multiprocessing\queues.py", line 113, in get
File "multiprocessing\managers.py", line 943, in RebuildProxy
File "multiprocessing\managers.py", line 793, in __init__
File "multiprocessing\managers.py", line 847, in _incref
File "multiprocessing\connection.py", line 490, in Client
File "multiprocessing\connection.py", line 691, in PipeClient
FileNotFoundError: [WinError 2] The system cannot find the file specified
Процесс в пуле процессов был внезапно прерван во время работы или ожидания будущего. -> Ошибка мультипроцессора
Это мой кусок кода, который создает эту ошибку:
with concurrent.futures.ProcessPoolExecutor() as executor:
try:
#multiprocesses = executor.map(mymodules.run_smartphone, list_arguments_smartphones)
multiprocesses = executor.map(mymodules.run_smartphone, list_smartphones_connected,
[lock] * len(list_smartphones_connected))
for function_return_value in multiprocesses:
print(function_return_value)
except Exception as ex:
print(f"{ex} --> Error multiprocesses")
Поэтому я сделал exe с опцией --dir по порядку чтобы сделать исполняемый файл с куклами, и я получаю точно такую же проблему.
Я запускаю некоторые специфические c команды Pyinstaller, он что-то отображает, но я не понимаю, что это значит:
E:\>pyi-bindepend Myprogram.exe
Myprogram.exe {'KERNEL32.dll', '*_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.0.0_none', 'WS2_32.dll', 'ADVAPI32.dll'}
E:\>pyi-archive_viewer Myprogram.exe
pos, length, uncompressed, iscompressed, type, name
[(0, 270, 354, 1, 'm', 'struct'),
(270, 1124, 1832, 1, 'm', 'pyimod01_os_path'),
(1394, 4376, 9337, 1, 'm', 'pyimod02_archive'),
(5770, 7417, 18651, 1, 'm', 'pyimod03_importers'),
(13187, 1868, 4175, 1, 's', 'pyiboot01_bootstrap'),
(15055, 266, 321, 1, 's', 'pyi_rth_certifi'),
(15321, 1080, 1775, 1, 's', 'pyi_rth_multiprocessing'),
(16401, 8845, 18589, 1, 's', 'Myprogram'),
(25246, 3052666, 3052666, 0, 'z', 'PYZ-00.pyz')]
?
, поэтому я добавил в файл .spe c скрытый импорт:
hiddenimports=["socks","multiprocessing","concurrent"],
, так как видел проблемы с многопроцессорной обработкой и фьючерсами .. Но это ничего не исправило
Я попробовал это:
hiddenimports=["socks","multiprocessing","concurrent.futures"],
все та же проблема.
Поэтому я проверяю эту строку 691 в этом файле connection.py, но я не понимаю проблему:
def PipeClient(address):
'''
Return a connection object connected to the pipe given by `address`
'''
t = _init_timeout()
while 1:
try:
_winapi.WaitNamedPipe(address, 1000)<==------------------------[line 691]
h = _winapi.CreateFile(
address, _winapi.GENERIC_READ | _winapi.GENERIC_WRITE,
0, _winapi.NULL, _winapi.OPEN_EXISTING,
_winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL
)
except OSError as e:
if e.winerror not in (_winapi.ERROR_SEM_TIMEOUT,
_winapi.ERROR_PIPE_BUSY) or _check_timeout(t):
raise
else:
break
else:
raise
_winapi.SetNamedPipeHandleState(
h, _winapi.PIPE_READMODE_MESSAGE, None, None
)
return PipeConnection(h)
Я не достаточно хорош в Python, чтобы исправить эту проблему. Я могу просто сделать вывод, что Pyinstaller что-то ломает, так как скрипт отлично работает с терминала. Также я вижу, что система говорит, что не может найти файл. Итак, отсутствует файл или модуль, поэтому я попробовал кое-что в файле .spe c.
Кто-нибудь знает источник моей проблемы, пожалуйста?