Sto lavorando a uno script wrapper che eseguirà un eseguibile vmware, consentendo l'automazione delle operazioni di avvio/arresto/registrazione/annullamento della macchina virtuale. Sto cercando di utilizzare il sottoprocesso per gestire il richiamo dell'eseguibile, ma gli spazi nel percorso degli eseguibili e nei parametri dell'eseguibile non vengono gestiti correttamente dal sottoprocesso. Ecco un frammento di codice:Come utilizzare il sottoprocesso quando più argomenti contengono spazi?
vmrun_cmd = r"c:/Program Files/VMware/VMware Server/vmware-cmd.bat"
def vm_start(target_vm):
list_arg = "start"
list_arg2 = "hard"
if vm_list(target_vm):
p = Popen([vmrun_cmd, target_vm, list_arg, list_arg2], stdout=PIPE).communicate()[0]
print p
else:
vm_register(target_vm)
vm_start(target_vm)
def vm_list2(target_vm):
list_arg = "-l"
p = Popen([vmrun_cmd, list_arg], stdout=PIPE).communicate()[0]
for line in p.split('\n'):
print line
Se chiamo la funzione vm_list2, ottengo il seguente output:
$ ./vmware_control.py --list
C:\Virtual Machines\QAW2K3Server\Windows Server 2003 Standard Edition.vmx
C:\Virtual Machines\ubunturouter\Ubuntu.vmx
C:\Virtual Machines\vacc\vacc.vmx
C:\Virtual Machines\EdgeAS-4.4.x\Other Linux 2.4.x kernel.vmx
C:\Virtual Machines\UbuntuServer1\Ubuntu.vmx
C:\Virtual Machines\Other Linux 2.4.x kernel\Other Linux 2.4.x kernel.vmx
C:\Virtual Machines\QAClient\Windows XP Professional.vmx
Se chiamo la funzione vm_start, che richiede un parametro path-to-vm, ottengo il seguente output:
$ ./vmware_control.py --start "C:\Virtual Machines\ubunturouter\Ubuntu.vmx"
'c:\Program' is not recognized as an internal or external command,
operable program or batch file.
a quanto pare, la presenza di un secondo parametro con spazi incorporati sta modificando il modo in cui sottoprocesso interpreta il primo parametro. Qualche suggerimento su come risolvere questo?
python2.5.2/Cygwin/WinXP
Perché le tue barre sono in c:/Programmi/VMware/VMware Server/vmware-cmd. bat sta andando nella direzione sbagliata? Non è c: \ Program Files \ ...? –
Beh, cygwin è * nix port, quindi sembra che lo standard (o quello che ho capito sia lo standard) * nix slash notation La mia comprensione è che il sottoprocesso dovrebbe tradurre il separatore in qualsiasi cosa il sistema sottostante abbia bisogno: –
ha risolto per ora? – Gohan