--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

Antwort per Email an