Моя цель - создать систему управления проектами, которая будет запускаться из командной строки, принимать каталог в качестве входных данных, открывать ряд программ (а также файлы с помощью gnome-open), а затем иметь возможность закрыть их все попозже, когда вызывается с другим флагом.
Есть несколько вещей, которые я хотел бы открыть.Например, vscode, chromium, gnome-терминал.Я пытаюсь добиться этого, создав файл конфигурации json для каждого проекта.Когда проект открыт, пиды порожденных процессов сохраняются в файле конфигурации.Когда вызывается флаг -c, я хочу иметь возможность закрыть все в файле конфигурации с помощью pid.(Это реализация, над которой я работаю, если есть лучший способ, который все еще использует Python, я очень открыт для него)
Я могу открыть все, что хочу открыть, но процессы завершаются изатем оставьте осиротевшие окна.Пиды, которые я хранил, больше не активны, и я не могу их идентифицировать и закрыть.
Мои усилия за последние несколько часов были сосредоточены в основном на подпроцессе.Popen ().В качестве последнего средства я рассматриваю попытку использования os.system (), а затем нахождение соответствующего pid с помощью psutil.Я думаю, что это может сработать, но это заставляет меня чувствовать себя очень грязно.
Я получаю ответы здесь в течение многих лет, это первый раз, когда я не могу найти существующий ответ, хотя это может быть потому, что яТрудно сформулировать ситуацию.Заранее благодарим за помощь.
#!/usr/bin/python3.7
from subprocess import Popen, PIPE, DEVNULL
import argparse
import os
import json
import pickle
import signal
import time
from pprint import pprint
import psutil
# I've tried various things including shell=True, shell=False, trying to
# combine the Popen call with hold_script (which is just an executable
# python script that runs an infinite loop)
config = {}
def open_project():
"""Open project windows and save pids back to config"""
terminal = Popen(['gnome-terminal', TERM_DIR, '&&',
hold_script], stdout=PIPE, stderr=PIPE)
config['terminal'] = terminal.pid
print(f'[+] Terminal opened : pid:{terminal.pid}')
code = Popen(['code', PROJECT_PATH], shell=True,
stdout=DEVNULL, stderr=DEVNULL)
config['code'] = code.pid
print(f'[+] Code opened : pid:{code.pid}')
browser = Popen(
['chromium-browser', f'--user-data-dir={USER_DATA_DIR}'],
shell=True, stdout=DEVNULL, stderr=DEVNULL)
config['browser'] = browser.pid
print(f'[+] Chrome opened : pid:{browser.pid}')
def close_project():
"""Close any open project windows"""
for k, v in config.items():
kill_process(k, v)
config[k] = None
write_config()
print(f'[-] Project {PROJECT_NAME} has been closed.')
def kill_process(k, v):
"""Kill process and update config"""
if v:
try:
os.kill(v, signal.SIGKILL)
print(f'[-] {k.upper()} has been closed.')
except ProcessLookupError:
# process already closed
# my intention here was to catch windows I'd closed manually
pass
except Exception as e:
print('[!]', e)