Нужен вывод построчно в виде списка после выполнения команд внутри скрипта Python

Как я выполняю команды внутри скрипта Python как:

import os
import re

tes=list()
tes=os.system('p4 nc files @=4596830')

for line in tes:
     line2=re.findall('//depot/prod/DOT/dev/\w+((?:/\w*)*\.c)',line)
     print(line2)

я получаю вывод как:

//depot/prod/DOT/dev/freebsd/10/sys/dev/nvme/nvme.c#16 - edit change 4596830 (text)
//depot/prod/DOT/dev/mgmtgateway/src/tables/card.smf#12 - edit change 4596830 (text)
//depot/prod/DOT/dev/ontap/prod/driver/scsi/pmcsas_init.c#81 - edit change 4596830 (text)

TypeError: 'int' object has no attribute '__getitem__'

но мне нужны только файлы, которые заканчиваются расширением.c:

/freebsd/10/sys/dev/nvme/nvme.c
/ontap/prod/driver/scsi/pmcsas_init.c

2 ответа

Решение

os.system возвращает код состояния вызова, а не STDOUT, STDERR потоки. Python не знает, как перебирать целое число, поэтому он вызывает исключение.

Вы можете попробовать использовать subprocess и трубопровод STDOUT, STDERR в пользовательский поток, затем приведение к list,

import subprocess

call = subprocess.Popen("p4 nc files @=4596830", stdout=subprocess.PIPE)
stdout = call.communicate()[0]
files = stdout.split("\n")

Может быть, это может помочь

import os
import re

tes=list()
tes=os.system('p4 nc files @=4596830')

for line in tes:
     #line2=re.findall('//depot/prod/DOT/dev/\w+((?:/\w*)*\.c)',line)
     if ".c" in line:
         print(line)
Другие вопросы по тегам