#python #file-read
#python #файл-прочитан
Вопрос:
Я должен прочитать /proc/pid/status
файл, чтобы извлечь NSpid
поле, как показано ниже:
user@user-HP-Pavilion-Notebook:~$ cat /proc/5979/status | grep NSpid
NSpid: 5979 1417
Я должен извлечь 1417
из этого.
Я пробовал ниже:
print("Traversing tree")
pid=5947
for c in psutil.Process(pid).children(True):
cpid=c.pid
print(str(c.pid))
with open("/proc/cpid/status",'r') as origin_file:
for line in origin_file:
line = re.findall(r'NSpid', line)
if line:
line = line[0].split('"')[1]
print(line)
break
Эта программа обходит все дерево процессов и для каждого дочернего элемента пытается извлечь NSpid из файла состояния.
Но я получаю следующую ошибку :
Traversing tree
5979
Traceback (most recent call last):
File "cmp.py", line 48, in <module>
with open("/proc/cpid/status",'r') as origin_file:
FileNotFoundError: [Errno 2] No such file or directory: '/proc/$cpid/status'
Как это исправить?
Комментарии:
1. Это не полный путь? Если нет, то как это будет?
2. там есть файл @r0ei, смотрите результат командной строки, он способен отображать это
3. 5979 является первым дочерним элементом 5947
4. @r0ei в вашем ответе выводится пустая строка
Ответ №1:
Вы объявили переменную с именем cpid
, и, как я вижу, вы хотите использовать переменную внутри пути к файлу, чтобы вы могли использовать f
строки.
cpid=c.pid
print(str(c.pid))
with open(f"/proc/{cpid}/status") as origin_file:
...
Я все еще не уверен, какое значение вы хотите извлечь, поэтому вот мое решение, я искал NSpid
атрибут процесса и принял его значение.
...
cpid = c.pid
with open(f"/proc/{cpid}/status") as origin_file:
for line in origin_file.read().splitlines():
if line.split()[0] == 'NSpid:':
print(line.split()[2])
break
И если вы хотите извлечь атрибут целиком, просто измените print
функцию
# before
print(line.split()[2]) # changed this index from [1] to [2]
# after
print(line)
Комментарии:
1. Это то, что он печатает сейчас: обход дерева 5979 [] 5980 [] 5981 [] 5982 [] 5986 [] 5987 [] 5988 [] 5992 [] 5995 [] 5996 [] 5997 [] 5998 [] 6002 [] 6003 [] 6004 [] 6005 [] 6006 [] 6120 [] 6123
2. @user13145713 Это ваш вывод? И это то, что вы хотите получить? если нет, то какой исключенный результат?
3. Да, это мой вывод сейчас
4. строка будет выглядеть следующим образом: NSpid: 5979 1417
5. и я хочу извлечь только 1417