Я хотел бы получить уникальные имена процессов, PID и прослушивающие порты от psutil
.
В настоящее время у меня есть следующий код:
names, pids, ports = zip(*[(
proc.info['name'],
proc.info['pid'],
port.laddr.port)
for proc in psutil.process_iter(attrs=['name', 'pid']) if 'java' in proc.info['name']
for port in proc.connections() if port.status == psutil.CONN_LISTEN
])
Проблема заключается в том, что имена процессови идентификаторы PID дублируются, чтобы соответствовать количеству элементов из вложенного цикла for (ports):
>>> names
('java', 'java', 'java', 'java', 'java', 'java', 'java', 'java')
>>> pids
(15208, 15208, 15208, 15208, 15208, 15208, 15208, 15748)
>>> ports
(7574, 7574, 9462, 9463, 9461, 60588, 9463, 3875)
Думаю, я мог бы впоследствии преобразовать их в sets
, но я надеюсь, что есть лучший, более питонический способсделать это, не тратя ресурсов.
Обновление: чт 11 окт 14:36:33 UTC 2018
На основании ответа @Rouven B. У меня естьследующий код:
names = set()
pids = set()
ports = set()
for proc in psutil.process_iter(attrs=['name', 'pid']):
if 'java' not in proc.info['name']:
continue
names.add(proc.info['name'])
pids.add(proc.info['pid'])
for port in proc.connections():
if port.status == psutil.CONN_LISTEN:
ports.add(port.laddr.port)
Но мне все еще интересно, есть ли какой-то другой подход, возможно, с использованием одной из функций из itertools ?