--On Donnerstag, Februar 17, 2011 11:21:12 +0100 Denny Schierz <linuxm...@4lin.net> wrote:
hi,
Kurze Frage vorweg: hat vmware keine Python api? [...]
./vmx -g cluster1 Als Ausgabe soll ein schlichtes: off/on erscheinen. Ruft man das vmware-cmd Tool auf, sieht das so aus: vmware-cmd /vmfs/volumes/4c52874b-65503560-05f0-0021288ea4ad/cluster_1/cluster_1.vmx getstate Ausgabe: getstate() = off
splitte stdout nicht an den Zeileinenden und suche in der kompletten Zeichenkette: if output.find('getstate() = off') >= 0: print 'off' exit() elif output.find('getstate() = on') >= 0: print 'on' exit() else: # Irgendwas anderes print output string.find(<sub>) hat eine blöde api. Es gibt die Position des ersten Treffer für <sub> im string zurückgibt. Das kann also 0..n sein. Wenn er nicht gefunden wird bekommt man -1. Das läßt sich aber nicht auf True/False testen, denn bool(0) ist False (der Substring wurde am Anfang der Zeichenkette gefunden, bool(1) ist True und bool(-1) ist auch True. Also musst Du mit ">= 0" (gefunden) oder "< 0" (nicht gefunden) testen. Die den Pfad der Virtuellen Maschine hast Du ja in einer Liste. Wenn Du vm-namen benutzen willst sortiere die VMs in eine andere Datenstrukture ein, z.B. ein dict: machines_by_name = {} for vm in <liste der vms>: vm_name = vm.split('/')[-2] # letzter verzeichnisname # oder from os.path import splitext vm_name = splitext(vm)[0] # splitext gibt ein (dateiname, erweiterung) tuple zurück machines[vm_name] = vm dann kannst statt mit nummern mit namen arbeiten. vm = machines_by_name['cluster_1'] [...]
if regvm == None and getstate == None and setstate == None: print("Keine Paramter angegeben, siehe --help") if regvm == None and (getstate == None and setstate == None) or (getstate != None and setstate != None):
Die untere Bedingung ist im vorderen Teil Identisch mit der oberen. if "<var> == None" kannst Du durch "if <var>" ersetzen, weil None hier zu "False" evaluiert wird und damit wird das ein Vergleiche auf True oder False. Wenn Du explizit auf None testen musst, weil Deine Variable z.B. False, 0, '' (leerer string) oder ein leeres objekt sein kann, nimm "is": if <var> is None: # Testet, ob es sich um identische Objekte handelt. Denn:
False == None
True
0 == None
True
False is None
False Also z.B. if not (regvm or getstate or setstate): ... Ich hab dir den unteren Teil Deines Skriptes mal geordnet, wie man es häufig findet. ..Carsten def get_opts(): '''Kommandozeilenargumente sammeln''' parser = OptionParser() parser.add_option("-r", "--registerd-vm", action="store", type="string", dest="regvm", help="Get list of registerd VM, use 'all' to get all VMs") parser.add_option("-s", "--set-state", action="store", type="string", dest="setstate", #choices=['off', 'on', 'reset'], help="Set powerstate from VM") # willst Du das nicht mit type="int" speichern? parser.add_option("-g", "--get-state", action="store", type="string", dest="getstate", help="Get powerstate from VM") (options, args) = parser.parse_args() # Werte zuweisen regvm = options.regvm print("regvm", regvm) setstate = options.setstate print("setstate", setstate) getstate = options.getstate print("getstate", getstate) if regvm and regvm != 'all': try: regvm = int(regvm) except ValueError: parser.error('regvm kann nur "all" oder eine Zahl sein') if not (regvm or getstate or setstate): # will exit with errorcode 2 and prints usage message parser.error("Keine Paramter angegeben") if getstate and setstate: parser.error("-g und -s schliessen sich aus") return (regvm, getstate, setstate) def main(): (regvm, getstate, setstate) = get_opts() if regvm: reg_vm(reg_vm) elif getstate: get_state(getstate) if __name__ == '__main__': main() -- ---------------------------------------------------------------------------- PUG - Penguin User Group Wiesbaden - http://www.pug.org