Я немного волнуюсь.Последние два часа я пытаюсь сбросить, а затем загрузить объект Popen, используя укроп без малейшей удачи.Я получаю хорошо известную OSError: [Errno 22] Исключение из-за недопустимого аргумента, но действительно забавная вещь ... это 363 байта довольно далеко от 4ГБ.Ниже приведен пример минимальный :
import os
import dill
import struct
import subprocess
import collections
import multiprocessing
r, w = os.pipe()
def launcher(application):
os.close(r)
process = subprocess.Popen(application, shell=False)
with os.fdopen(w, 'wb') as ser:
dill.dump(process, ser, protocol=dill.HIGHEST_PROTOCOL, byref=True, recurse=True)
def launch(program, *args, **kwargs):
os.close(w)
application = [program] + list(args)
process = multiprocessing.Process(target=launcher, args=(application, ))
process.start()
process.join()
with os.fdopen(r, 'rb') as ser:
application_process = dill.load(ser)
process_pid = application_process.pid
process_handle = application_process.process_handle
print("PID: {pid}".format(pid=process_pid))
process_handle.wait(timeout=15)
print("Exited: {ec}.".format(ec=process_handle.returncode))
if __name__ == '__main__':
program = ['ping']
launch(program, '127.0.0.1', '-n', '10')
Давайте не будем вдаваться в подробности, почему я делаю что-то подобное, и сконцентрируемся на том, почему это происходит?
Process Process-1:
Traceback (most recent call last):
File "C:\Users\xyz\AppData\Local\Programs\Python\Python34-32\lib\multiprocessing\process.py", line 297, in _bootstrap
self.run()
File "C:\Users\xyz\AppData\Local\Programs\Python\Python34-32\lib\multiprocessing\process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\xyz\PycharmProjects\Test\main\Main.py", line 16, in launcher
dill.dump(process, ser, protocol=dill.HIGHEST_PROTOCOL, byref=True, recurse=True)
OSError: [Errno 22] Invalid argument
Traceback (most recent call last):
File "C:/Users/xyz/PycharmProjects/Test/main/Main.py", line 40, in <module>
launch(program, '127.0.0.1', '-n', '10')
File "C:/Users/xyz/PycharmProjects/Test/main/Main.py", line 28, in launch
application_process = dill.load(ser)
File "C:\Users\xyz\PycharmProjects\Test\venv\lib\site-packages\dill\_dill.py", line 304, in load
obj = pik.load()
EOFError: Ran out of input
Процесс завершен с кодом выхода 1