在 python 脚本中执行命令后需要逐行输出列表

Need an output line by line as list after executing commands inside python script

当我在 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

os.system returns 调用的状态代码,而不是 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)