Pyinstaller создает эту ошибку: «Файл« multiprocessing \ connection.py », строка 691, в PipeClient» - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь сделать исполняемый файл моего 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.

Кто-нибудь знает источник моей проблемы, пожалуйста?

...