龙空技术网

python - 实现vmware相关操作

啖五谷之轮回 361

前言:

今天大家对“vmwarepython”可能比较讲究,兄弟们都想要知道一些“vmwarepython”的相关资讯。那么小编在网络上搜集了一些关于“vmwarepython””的相关资讯,希望同学们能喜欢,我们快快来学习一下吧!

本脚本是通过python实现对vmware workstation虚拟机进行操作的小脚本,主要原理是用python来调用vmrun.exe,传递各种不同的参数给它,来进行不同的操作。

相关操作代码如下:

import osimport subprocessimport time'''============    :function.......: 打开虚拟机    :param delta....: vmware_path:vmware路径                      vmx_path:虚拟机vmx路径                      vm_snap_name:快照名    :return.........: None============'''def run_vm(vmware_path, vmx_path):    # vmrun -T ws start "c:\my VMs\myVM.vmx"    # os.system(vmware_path + ' -T ws start ' + vmx_path)    # os.system()是调用了C语言的标准函数system()    # os.system()只是简单地把字符串传递给system()函数,自己并不会对字符串进行处理    # 所以这个bug应该是system()函数的问题或者windows shell的问题,使用""括起来或者使用subprocess模块    # os.system('"' + vmware_path + ' -T ws start ' + vmx_path + '"')    subprocess.Popen(vmware_path + ' -T ws start ' + vmx_path)'''============    :function.......: 关闭虚拟机    :param delta....: vmware_path:vmware路径                      vmx_path:虚拟机vmx路径                      vm_snap_name:快照名    :return.........: None============'''def stop_vm(vmware_path, vmx_path):    # vmrun -T ws stop "c:\my VMs\myVM.vmx"    subprocess.Popen(vmware_path + ' -T ws stop ' + vmx_path)'''============    :function.......: 重置虚拟机    :param delta....: vmware_path:vmware路径                      vmx_path:虚拟机vmx路径                      vm_snap_name:快照名    :return.........: None============'''def reset_vm(vmware_path, vmx_path):    # vmrun -T ws reset "c:\my VMs\myVM.vmx"    subprocess.Popen(vmware_path + ' -T ws reset ' + vmx_path)'''============    :function.......: 挂起虚拟机    :param delta....: vmware_path:vmware路径                      vmx_path:虚拟机vmx路径    :return.........: None============'''def suspend_vm(vmware_path, vmx_path):    # vmrun -T ws suspend "c:\my VMs\myVM.vmx"    subprocess.Popen(vmware_path + ' -T ws suspend    ' + vmx_path)'''============    :function.......: 恢复快照    :param delta....: vmware_path:vmware路径                      vmx_path:虚拟机vmx路径                      vm_snap_name:快照名    :return.........: None============'''def revert_vm_snap(vmware_path, vmx_path, vm_snap_name):    # vmrun -T ws revertToSnapshot "c:\my VMs\myVM.vmx" mySnapshot    subprocess.Popen(vmware_path + ' -T ws revertToSnapshot ' + vmx_path + ' ' + vm_snap_name)'''============    :function.......: 创建快照    :param delta....: vmware_path:vmware路径                      vmx_path:虚拟机vmx路径                      vm_snap_name:快照名    :return.........: None============'''def create_vm_snap(vmware_path, vmx_path, vm_snap_name):    # vmrun -T ws snapshot "c:\my VMs\myVM.vmx" mySnapshot    subprocess.Popen(vmware_path + ' -T ws snapshot ' + vmx_path + ' ' + vm_snap_name)'''============    :function.......: 删除快照    :param delta....: vmware_path:vmware路径                      vmx_path:虚拟机vmx路径                      vm_snap_name:快照名    :return.........: None============'''def delete_vm_snap(vmware_path, vmx_path, vm_snap_name):    # vmrun -T ws deleteSnapshot "c:\my VMs\myVM.vmx" mySnapshot    subprocess.Popen(vmware_path + ' -T ws deleteSnapshot ' + vmx_path + ' ' + vm_snap_name)

调试中发现使用os.system存在个bug。如果参数只是一个加引号的字符串,os.system()就可以正常执行,但如果有多个引号对,就会出现以上错误。也就是说,如果参数类似"xx yy zz"这样的类型,os.system()可以成功执行;如果参数类似"xx yy" "aa bb"这样的类型,os.system()就会出错。

查找了相关资料发现:os.system()是调用了C语言的标准函数system(),不过os.system()函数的说明,表示os.system()这个方法有局限性。并建议使用subprocess模块。

尽量不要使用os.system()方法,而是用subprocess中的Popen对象或者call()方法代替,以免产生不可预知的错误。

python的官方网站上有人提交这个bug:,不过这个bug在07年就提交了,但看结果是wont fix(不会修复),看后面的评论,原来是os.system()只是简单地把字符串传递给system()函数,自己并不会对字符串进行处理,所以这个bug应该是system()函数的问题或者windows shell的问题。

相关资料连接:

标签: #vmwarepython