【问题标题】:Controlling VirtualBox via COM from Python?从 Python 通过 COM 控制 VirtualBox?
【发布时间】:2010-10-24 00:18:47
【问题描述】:

我正在尝试通过 Python 的 COM 接口控制最新的 Sun VirtualBox。但是,不幸的是,以下代码不起作用:

import win32com.client
VBOX_GUID = "{B1A7A4F2-47B9-4A1E-82B2-07CCD5323C3F}"
try :
  oVbox = win32com.client.Dispatch( VBOX_GUID )
  oVbox.FindMachine( "kubuntu" )
except Exception as oEx:
  print str( oEx )

错误是一般的“(-2147467262,'不支持此类接口',无,无)” 似乎错误的部分是我通过 Python 处理 COM。任何人都可以看看并提出一些明显的我做错的事情?

【问题讨论】:

  • virtualbox 不支持 mozilla 的 XPCOM 但不支持 m$' COM?
  • 只是一个不相关的建议,不要像你那样捕获每个异常,这样很难找到错误。如果您不添加 try/except,则获得的默认回溯行为会更有用。
  • 只是为了说明一个问题,测试代码
  • 平!你看到我的回答了吗?
  • 啊,是的,谢谢。这就是问题所在。我还联系了 VBox 开发人员,他们确认当前的 OLE 自动化支持不完整 - 并非所有类都有 IDIspatch。他们表示,几个月后将发布新版本来解决这个问题。

标签: python com virtualbox


【解决方案1】:

问题是FindMachine("kubuntu")返回的对象不支持IDispatch interface,win32com也不支持。

您可以为此使用我的comtypeshttp://starship.python.net/crew/theller/comtypes/,但您需要修补存储库中的版本以使其与VirtualBox 类型库一起使用。

这是一个演示会话:

Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from comtypes.client import CreateObject
>>> box = CreateObject("VirtualBox.VirtualBox")
>>> m = box.FindMachine("Fedora")
>>> print m.State
4
>>> print m.CpuCount
1
>>> print m.Name
Fedora
>>>

这是你需要的补丁:

Index: automation.py
===================================================================
--- automation.py   (revision 507)
+++ automation.py   (working copy)
@@ -753,6 +753,8 @@
     c_float: VT_R4,
     c_double: VT_R8,

+    c_ulonglong: VT_I8,
+
     VARIANT_BOOL: VT_BOOL,

     BSTR: VT_BSTR,

【讨论】:

  • 仅供参考:comtypes 版本 0.6.1 不再需要该补丁。
猜你喜欢
  • 2022-01-03
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多