Можно ли в линуксе передать экземпляр класса из одного процесса в другой и выполнить с ним действия? Собственно, сабж. В качестве примера и разъяснения приведу ту задачу, которая его передо мной поставила.
Есть рабочий компьютер, на нем Linux Mint. На нем выполняется скрип Python 3 (назовем его check.py), который инициирует два соединения с коммутаторами в сети по телнету (сделал через pexpect), в каждом из них выполняет действия, собирает информацию, а потом в одном из соединений оставляет интерактив, а второе удаляет. Мне захотелось открывать второе окно терминала, в котором окажется интерактив со вторым соединением.
Поскольку я все повторяющиеся действия попрятал в классы, код выглядел примерно так:from connections import connect_to_switch
switch1 = connect_to_switch('192.168.1.1')
switch2 = connect_to_switch('192.168.2.1')
#Дальше всякие действия с этими соединениями
del switch2
switch1.interact()
То есть мне захотелось новое окно терминала, в котором бы был результат выполнения switch2.interact(), причем мне не хотелось рвать соединение до 192.168.2.1. Но я совсем не понял, как это можно сделать, не совсем понимаю, что для такого результата нужно, и ничего не нашел в гугле. Поэтому решил задачу через дополнительный скрипт:from connections import connect_to_switch
import subprocess
switch1 = connect_to_switch('192.168.1.1')
switch2 = connect_to_switch('192.168.2.1')
#Дальше всякие действия с этими соединениями
del switch2
subprocess.call("mate-terminal -e '/home/user/script.py {}'".format('192.168.2.1'), shell=True)
switch1.interact()
В скрипте /home/user/script.py, как несложно догадаться, 3 строчки, которые приведены выше уже по два раза.
Какие-то соображения, оказавшиеся в голове, сформулировали уже уточненные вопросы:Как можно получить объект, определенный в check.py, и какие параметры для этого нужны? Как можно выполнить с ним действие, определенное только в check.py? Может быть, можно запустить интерактив по switch2 в самом скрипте (родительском), а потом совместить новое окно терминала с этой сессией? (если да, объясните, пожалуйста, на уровне принципа)Если программа в принципе не может выполнить свой код в рамках другого процесса, объясните, пожалуйста, почему. По каким темам нужно ликвидировать свою безграмотность, чтобы уметь самому на все эти вопросы ответить?

21 Авг 2019 в 06:26
202 +1
0
Ответы
1

В Linux нет прямого способа передать экземпляр класса из одного процесса в другой, так как каждый процесс имеет свое собственное адресное пространство и не имеет доступа к памяти других процессов напрямую. Однако, существуют способы обмена данными между процессами, такие как сокеты, файлы или используя межпроцессное взаимодействие (IPC).

Для вашей конкретной задачи, вам необходимо запустить второй скрипт в новом процессе и передать ему необходимые параметры для создания объекта класса. Вы можете использовать аргументы командной строки для передачи этих параметров.

Чтобы выполнить действие, определенное в check.py в другом процессе, вам необходимо передать объект или данные, с которыми нужно работать, другому процессу и выполнить нужные действия в нем.

Если вы хотите запустить интерактив в новом окне терминала для объекта switch2 из родительского скрипта, вам придется передать данные о текущей сессии или объекте в новый процесс и создать для него новое окно терминала.

Для изучения тем, связанных с межпроцессным взаимодействием в Linux, вам стоит изучить сокеты, взаимодействие через файлы, использование IPC механизмов (например, семафоры, разделяемая память, очереди сообщений) и работу с процессами. Также полезно изучить специфические инструменты для работы с межпроцессным взаимодействием, такие как multiprocessing, subprocess, threading.

20 Апр 2024 в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир