Интересный вопрос.
Как всегда, есть разные способы получить список этих приложений, каждый из которых имеет конкретные рекламные и недостатки.
Поскольку в Launcher появляются только приложения с окном (отображаемым), используя:
[ f1](wmctrl по умолчанию не установлен), мы можем получить список открытых окон и идентификатор процесса, к которому относятся окна. Формат выходного файла:
0x05204641 0 12618 jacob-System-Product-Name verhaal (~) - gedit
, где для нас наиболее важная информация:
первая строка (0x05204641); это окно -и третья строка (12618); это идентификатор процесса (pid), к которому принадлежит окно, и последний раздел (verhaal (~) - gedit); это имя окна.Как только у нас есть pid, мы можем найти соответствующее имя процесса командой:
ps -p <pid> -o comm=
Мы можем выполнить скрипты выше и перечислить выходные данные для существующие окна, похожие на python:
{'gnome-terminal', 'nautilus', 'gedit', 'GuitarPro.exe', 'firefox', 'thunderbird', 'soffice.bin'}
Это кажется простым. Однако, как всегда, реальность немного сложнее. Есть несколько исключений и осложнений, о которых нам нужно позаботиться:
Некоторые окна будут принадлежать pid 0, что вызовет ошибку при попытке получить их свойства. Windows Idle (python IDE) или tkinter - это такие окна. Некоторые окна не являются «реальными» или окнами, такими как переходные окна (окна, которые вызывают и принадлежат другим окнам) или, например, сам рабочий стол. Эти окна отображаются в виде окон на выходе wmctrl, но не отображаются отдельно в Dash. В некоторых случаях имя приложения сильно отличается от имени процесса, например, в случае LibreOffice, где все модули имеют имя процесса soffice.bin. В то же время выполнение команды soffice.bin не будет работать. Если вам нужно идентифицировать модули (Calc, Writer и т. Д.) Отдельно, вам нужно будет получить дополнительную информацию, например, из имени окна. Другим примером является имя процесса gnome-terminal, как оно отображается в списке процессов, как и на выходе ps -e ww. В 14.04, gnome-terminal появляется как gnome-terminal, однако в 15.04 / 15.10 он показывает: /usr/lib/gnome-terminal/gnome-terminal-server.Чтобы исправить наиболее важные проблемы, описанные выше, вам нужно:
первую строку (0x05204641 ); это окно -id Чтобы исправить имя процесса gnome-terminal в 15.x (если вы хотите, чтобы имя представленного процесса было gnome-terminal), нам нужно добавить исключение, чтобы переименовать имя процесса в gnome-terminal, если он выглядит как /usr/lib/gnome-terminal/gnome-terminal-server#!/usr/bin/env python3
import subprocess
import sys
try:
listed = sys.argv[1]
except IndexError:
listed = []
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
def check_wtype(w_id):
# check the type of window; only list "NORMAL" windows
return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
def get_process(w_id):
# get the name of the process, owning the window
proc = get(["ps", "-p", w_id, "-o", "comm="])
proc = "gnome-terminal" if "gnome-terminal" in proc else proc
return proc
wlist = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"])\
.decode("utf-8").splitlines()]
validprocs = set([get_process(w[2]) for w in wlist if check_wtype(w[0]) == True])
if listed == "-list":
for p in validprocs:
print(p)
else:
print(validprocs)
Из вашего вопроса это не совсем понятно что является целью списка найденных. Если вам нужно иметь имя приложения, так как оно появляется в интерфейсе («читаемые» имена), может потребоваться совершенно другой подход:
Чтобы исправить имя процесса gnome-terminal в 15.x (если вы хотите, чтобы имя представленного процесса было gnome-terminal), нам нужно добавить исключение, чтобы переименовать имя процесса в gnome-terminal, если оно отображается как /usr/lib/gnome-terminal/gnome-terminal-server [d52 ] И в этом случае, однако, реальность также сложнее, чем теория, как объяснено здесь.Я решил его, загрузив пакет .deb
$ wget http://launchpadlibrarian.net/319286878/php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb
--2017-09-27 16:11:01-- http://launchpadlibrarian.net/319286878/php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb
Resolving launchpadlibrarian.net (launchpadlibrarian.net)... 91.189.89.228, 91.189.89.229
Connecting to launchpadlibrarian.net (launchpadlibrarian.net)|91.189.89.228|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 15726 (15K) [application/x-debian-package]
Saving to: ‘php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb’
php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb 100%[====================================================================================================================================>] 15.36K --.-KB/s in 0.007s
2017-09-27 16:11:01 (2.09 MB/s) - ‘php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb’ saved [15726/15726]
$
и установив его ...
$ sudo dpkg -i php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb
Selecting previously unselected package php7.0-bcmath.
(Reading database ... 127511 files and directories currently installed.)
Preparing to unpack php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb ...
Unpacking php7.0-bcmath (7.0.18-0ubuntu0.16.04.1) ...
Setting up php7.0-bcmath (7.0.18-0ubuntu0.16.04.1) ...
Creating config file /etc/php/7.0/mods-available/bcmath.ini with new version
Processing triggers for php7.0-fpm (7.0.18-0ubuntu0.16.04.1) ...
$
простой и быстрый
$ apt-cache policy php7.0-bcmath
php7.0-bcmath:
Installed: 7.0.18-0ubuntu0.16.04.1
Candidate: 7.0.22-0ubuntu0.16.04.1
Version table:
7.0.22-0ubuntu0.16.04.1 500
500 http://nova.clouds.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages
500 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages
*** 7.0.18-0ubuntu0.16.04.1 100
100 /var/lib/dpkg/status
7.0.4-7ubuntu2 500
500 http://nova.clouds.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
$
Я решил его, загрузив пакет .deb
$ wget http://launchpadlibrarian.net/319286878/php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb
--2017-09-27 16:11:01-- http://launchpadlibrarian.net/319286878/php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb
Resolving launchpadlibrarian.net (launchpadlibrarian.net)... 91.189.89.228, 91.189.89.229
Connecting to launchpadlibrarian.net (launchpadlibrarian.net)|91.189.89.228|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 15726 (15K) [application/x-debian-package]
Saving to: ‘php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb’
php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb 100%[====================================================================================================================================>] 15.36K --.-KB/s in 0.007s
2017-09-27 16:11:01 (2.09 MB/s) - ‘php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb’ saved [15726/15726]
$
и установив его ...
$ sudo dpkg -i php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb
Selecting previously unselected package php7.0-bcmath.
(Reading database ... 127511 files and directories currently installed.)
Preparing to unpack php7.0-bcmath_7.0.18-0ubuntu0.16.04.1_amd64.deb ...
Unpacking php7.0-bcmath (7.0.18-0ubuntu0.16.04.1) ...
Setting up php7.0-bcmath (7.0.18-0ubuntu0.16.04.1) ...
Creating config file /etc/php/7.0/mods-available/bcmath.ini with new version
Processing triggers for php7.0-fpm (7.0.18-0ubuntu0.16.04.1) ...
$
простой и быстрый
$ apt-cache policy php7.0-bcmath
php7.0-bcmath:
Installed: 7.0.18-0ubuntu0.16.04.1
Candidate: 7.0.22-0ubuntu0.16.04.1
Version table:
7.0.22-0ubuntu0.16.04.1 500
500 http://nova.clouds.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages
500 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages
*** 7.0.18-0ubuntu0.16.04.1 100
100 /var/lib/dpkg/status
7.0.4-7ubuntu2 500
500 http://nova.clouds.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
$