Существует ли API-интерфейс JetBrains для порта конфигурации сокетов? - PullRequest
1 голос
/ 08 июля 2019

Я использую много проектов WebStorm одновременно.Я сделал Python GUI для основных сценариев этих проектов, и я запускаю WebStorm для любого из них, запуская webstrom . внутри каждого из них.

Я хочу знать, какой из них действительно открыт, потому что, когда я пытался использовать python 'psutil', и я только обнаружил, что дочерний процесс java первого открытого проекта, остальные из них, вероятно, являются своего рода «дополнительным окном»для первого открытия.

Итак, в /usr/local/bin/webstorm.sh я обнаружил, что этот скрипт запрашивает какой-либо порт, если WebStorm открыт, и пытается создать следующий экземпляр, если он действительно:

CONFIG_PATH = u'/home/pawel/.WebStorm2019.1/config'
SYSTEM_PATH = u'/home/pawel/.WebStorm2019.1/system'

import socket
import struct
import sys
import time

def try_activate_instance(args):
    port_path = os.path.join(CONFIG_PATH, 'port')
    token_path = os.path.join(SYSTEM_PATH, 'token')
    if not (os.path.exists(port_path) and os.path.exists(token_path)):
        return False

    try:
        with open(port_path) as pf:
            port = int(pf.read())
        with open(token_path) as tf:
            token = tf.read()
    except (ValueError):
        return False

    s = socket.socket()
    s.settimeout(0.3)
    try:
        s.connect(('127.0.0.1', port))
    except (socket.error, IOError):
        return False

    found = False
    while True:
        try:
            path_len = struct.unpack('>h', s.recv(2))[0]
            path = s.recv(path_len).decode('utf-8')
            if os.path.abspath(path) == os.path.abspath(CONFIG_PATH):
                found = True
                break
        except (socket.error, IOError):
            return False

    print(found)
    if found:
        cmd = 'activate ' + token + '\0' + os.getcwd() + '\0' + '\0'.join(args)
        if sys.version_info[0] >= 3: cmd = cmd.encode('utf-8')
        encoded = struct.pack('>h', len(cmd)) + cmd
        s.send(encoded)
        time.sleep(0.5)  # don't close the socket immediately
        return True

    return False


try_activate_instance([])

Существуют ли какие-либо другие команды, кроме activate [token] или JetBrains wiki, например:

  • 'isactive [token] [имя_проекта]' - возвращает, если проект из этого каталога открыт

  • 'target [token] [имя_проекта]' - переместить окно проекта в начало в linux

...