Как я могу открыть окна с помощью скрипта Python, а затем закрыть их позже? - PullRequest
0 голосов
/ 22 сентября 2019

Моя цель - создать систему управления проектами, которая будет запускаться из командной строки, принимать каталог в качестве входных данных, открывать ряд программ (а также файлы с помощью 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)
...