Нужен вывод построчно в виде списка после выполнения команд внутри скрипта 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)