Estoy trabajando en una secuencia de comandos envoltura que ejercerá un ejecutable vmware, lo que permite la automatización de las acciones de inicio/cierre/registro/anulación de la máquina virtual. Estoy tratando de usar un subproceso para manejar la invocación del ejecutable, pero los espacios en la ruta de los ejecutables y en los parámetros del ejecutable no se manejan correctamente por subproceso. A continuación se muestra un fragmento de código:Cómo usar el subproceso cuando varios argumentos contienen espacios?
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
Si llamo a la función vm_list2, me sale el siguiente resultado:
$ ./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
Si llamo a la función vm_start, lo que requiere un parámetro de ruta-a vm, me sale el siguiente resultado:
$ ./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.
al parecer, la presencia de un segundo parámetro con espacios incrustados está alterando la forma en que el subproceso está interpretando el primer parámetro. ¿Algunas sugerencias para resolver esto?
python2.5.2/cygwin/WinXP
¿Por qué son sus barras oblicuas en c:/Archivos de programa/VMware/VMware Server/vmware-cmd. ¿va mal por error? ¿No es c: \ Archivos de programa \ ...? –
Bueno, cygwin es el puerto * nix, por lo que parece gustarle el estándar (o lo que entiendo que es el estándar) * notación de barras de nix Tengo entendido que el subproceso debe traducir el separador a lo que necesite el sistema subyacente. –
¿Lo resolvió por ahora? – Gohan