【发布时间】:2010-10-22 17:51:22
【问题描述】:
我正在开发一个包装脚本,该脚本将运行 vmware 可执行文件,允许虚拟机启动/关闭/注册/注销操作的自动化。我正在尝试使用子进程来处理调用可执行文件,但是子进程未正确处理可执行文件路径和可执行文件参数中的空格。下面是一段代码:
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
如果我调用 vm_list2 函数,我会得到以下输出:
$ ./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
如果我调用需要路径到 vm 参数的 vm_start 函数,我会得到以下输出:
$ ./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.
显然,带有嵌入空格的第二个参数的存在正在改变子进程解释第一个参数的方式。有关如何解决此问题的任何建议?
python2.5.2/cygwin/winxp
【问题讨论】:
-
为什么你在 c:/Program Files/VMware/VMware Server/vmware-cmd.bat 中的斜线走错了?不是 c:\Program Files\... 吗?
-
嗯,cygwin 是 *nix 端口,所以它似乎喜欢标准(或我理解的标准)*nix 斜线符号。我的理解是子进程应该将分隔符转换为底层系统需要的任何内容。
-
现在解决了吗?
标签: python subprocess