我正在开发一个包装器脚本,它将执行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_start函数,它需要一个到vm的路径参数,我会得到以下输出:
$ ./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
发布于 2009-04-30 13:41:11
如果路径中有空格,我找到的正确解释它们的最简单方法是这样的。
subprocess.call('""' + path + '""')我不知道它到底为什么需要双引号,但这是有效的。
发布于 2009-04-30 01:46:59
'c:\Program' is not recognized as an internal or external command,
operable program or batch file.要获取此消息,请执行以下任一操作:
使用shell=True的
vmrun_cmd = r"c:\Program Files\VMware\VMware Server\vmware-cmd.bat“subprocess.Popen(代码的其他部分中的vmrun_cmd,vmware vmrun_cmd
内部获取此错误
可以尝试的内容:
subprocess.Popen(r"c:\Program Files\VMware\VMware Server\vmware-cmd.bat")
如果这是可行的,那么引用问题是不可能的。如果不是,那么您已经隔离了问题。
发布于 2009-04-30 02:00:13
我相信处理列表参数的list2cmdline()会在空格上拆分任何字符串参数,除非字符串包含双引号。所以我希望
vmrun_cmd = r'"c:/Program Files/VMware/VMware Server/vmware-cmd.bat"'成为你想要的。
您还可能希望用双引号将其他参数(如target_vm)括起来,前提是它们也分别表示一个不同的参数,以提供给命令行。就像这样
r'"%s"' % target_vm(例如)应该适合。
请参阅the list2cmdline documentation
达阿
https://stackoverflow.com/questions/804995
复制相似问题