从索引修剪字符串

时间:2017-09-07 14:10:48

标签: python openshift

我现在有一个或多或少的工作示例,如下所示,可以在openshift中杀死一些pod。

现在已经停滞不前了。

myindx = out.find(key)
print out[myindx:-1].rstrip()

outoc get pod --all-namespaces ...的输出,看起来像这样

 -n namespace01 pod-name-9-xd45
 -n namespace01 pod-name-9-xd67
 -n namespace02 pod-name2-9-xd45
 -n namespace02 pod-name2-9-rd45

out.find(key)我现在找到了正确的行,我需要整行来调用oc delete $line

在perl中,我会将oc get pod --all-namespaces ...的所有输出放入一个数组中并搜索数组中的每一行但是如何在python中执行此操作?

感谢您的帮助。

#!python

import StringIO
import sys
import re
import subprocess
import shlex
from collections import defaultdict

# Since you're keeping counts, we'll initialize this so that the values
# of the dictionary are `int`
myhash = defaultdict(lambda: 0)

if sys.argv[3] != "NodeReady":
     sys.exit(0)

commandline = shlex.split("/bin/oc get pod --all-namespaces")

proc = subprocess.Popen(commandline,stdout=subprocess.PIPE)
out, err = proc.communicate()
buf = StringIO.StringIO(out)


for line in buf.readlines():
#    print line
    """
    Diese Projekte und pod Zeilen werden ignoriert
    """
    if re.match('^NAMESPACE|.*-router|^logging|^default|.*infra-ipfailover|.*-(build|deploy)',line):
        continue
    linesplited = line.split()
    prefix = re.split('(.*)-\d+-\w+$',linesplited[1])
    #print  linesplited[1]
    #print prefix[1]
    myhash[prefix[1]] += 1

commandline = shlex.split('/bin/oc get pod --all-namespaces -o template --template=\'{{range .items }} -n {{ .metadata.namespace }} {{.metadata.name}}\n{{end}}\'')

proc = subprocess.Popen(commandline,stdout=subprocess.PIPE)
out, err = proc.communicate()
#print out
buf = StringIO.StringIO(out)
#print buf

#for line in buf.readlines():
#    print line

for key in myhash.keys():
    print "<<<>>>"
#    print myhash[key] % 2 , "\n"
    print key,":",myhash[key]
    if  myhash[key] % 2 :
        if myhash[key] > 1:
            print "mod 2",key,":",myhash[key]
            myindx = out.find(key)
            print out[myindx].rstrip()
    else:
        print "not mod 2",key,":",myhash[key]
        print out.find(key)

1 个答案:

答案 0 :(得分:1)

我在黑暗中拍摄了一点,但我认为你的问题可以减少到以下几点。

在此行之后,out应该包含您提到的所有输出。

out, err = proc.communicate() 

out可能看起来像这样:

-n namespace01 pod-name-9-xd45\n
-n namespace01 pod-name-9-xd67\n
-n namespace02 pod-name2-9-xd45\n
-n namespace02 pod-name2-9-rd45\n

不是将其推入StringIO对象,而是将此字符串剪切为数组:

output_lines = [x.strip() for x in output.split('\n')]

然后output_lines看起来像这样:

['-n namespace01 pod-name-9-xd45',
 '-n namespace01 pod-name-9-xd67',
 '-n namespace02 pod-name2-9-xd45',
 '-n namespace02 pod-name2-9-rd45']

然后你想找到包含你的密钥的数组中的每个字符串。

if  myhash[key] % 2 :
    if myhash[key] > 1:
        print "mod 2",key,":",myhash[key]
        for ol in output_lines:
            myindx = ol.find(key)
            if myindx > -1:
                print ol