Ошибка при чтении /proc / $pid/status в python

#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