是否可以使用python3绑定VirtualBox?

时间:2017-06-10 19:34:10

标签: python python-3.x virtualbox

我正在尝试使用python 3绑定到VirtualBox,但似乎有破坏的依赖项。对我来说,似乎很奇怪,在人们遇到这个问题的〜4年里,这个问题还没有得到解决。也许我错过了一些明显的东西。它已经发生了。

我已经通过我的操作系统的pacakage管理器安装了虚拟机主机模块,sdk和扩展。然后,通过pip:

pip install pyvbox

导入工作:

from virtualbox import VirtualBox, Session, Manager, WebServiceManager

但是,任何尝试实例化任何内容都会导致异常抱怨缺少vboxapi

box = VirtualBox()

回溯:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python3.6/site-packages/virtualbox/library_ext/vbox.py", line 22, in __init__
    manager = virtualbox.Manager()
  File "/usr/lib/python3.6/site-packages/virtualbox/__init__.py", line 130, in __init__
    with import_vboxapi() as vboxapi:
  File "/usr/lib/python3.6/contextlib.py", line 82, in __enter__
    return next(self.gen)
  File "/usr/lib/python3.6/site-packages/virtualbox/__init__.py", line 45, in import_vboxapi
    import vboxapi
  File "/home/$USER/.eclipse/org.eclipse.platform_4.6.3_155965261_linux_gtk_x86_64/plugins/org.python.pydev_5.7.0.201704111357/pysrc/_pydev_bundle/pydev_import_hook.py", line 20, in do_import
    module = self._system_import(name, *args, **kwargs)
ModuleNotFoundError: No module named 'vboxapi'

PyPi上有一个vboxapi,但它没有安装,因为没有与之关联的代码,也没有关于PyPi页面的任何有用信息: https://pypi.python.org/pypi/vboxapi

这里有一些关于勇敢的灵魂比我的勇敢努力的几个链接。我不能立即清楚哪个是正确的解决方案,或者两者是否仍然相关,因为它们分别来自3年和4年前。

https://github.com/GreatFruitOmsk/vboxapi-py3

https://github.com/jbuergel/vboxapi-py3

同样从3年前开始,vboxapi.diff和vboxapi的整合:

https://www.virtualbox.org/pipermail/vbox-dev/2014-April/012231.html

2 个答案:

答案 0 :(得分:9)

我是pyvbox软件包的当前维护者。 VirtualBox SDK已经支持Python 3,我使用Python 3.5来开发库。我建议卸载并重新安装最新版本的SDK(在编写本文时为5.1.22)。

您可以在VirtualBox downloads page上找到SDK。解压缩存档并使用您的系统Python使用以下命令运行vboxapisetup.py文件:

python vboxapisetup.py install

您不需要在任何virtualenv中安装它,因为pyvbox除了virtualenv安装之外还会搜索您的系统库,以便更好地使用。

如果在运行这些步骤后使用pyvbox包时遇到问题,请打开一个问题并提供尽可能多的信息,包括您采取的步骤,操作系统,系统Python所在的位置,VirtualBox的哪个版本&安培;您正在使用的SDK,我会尽我所能帮助您。

答案 1 :(得分:1)

是的,可能,设置起来非常棘手,但现在对我来说很好用(Ubuntu 18.04 / python3.6 / virtualbox 6.0)。


错误:

ModuleNotFoundError: No module named 'vboxapi'

意味着python3找不到vboxapi模块,现在有两种方法可以将vboxapi软件包“强制安装”到python3


第一种方法:[简单]:假设pyvbox已经安装并且可以在python2.7上正常工作,在这种情况下,您可以将包从python2.7 dist-packages复制到python3 dist-package:

sudo cp -r /usr/lib/python2.7/dist-packages/vboxapi /usr/lib/python3/dist-packages

第二种方法:[更棘手]:转到VirtualBox,然后下载最后一个Software Developer Kit (SDK),实际上是6.0.4

解压缩归档文件并使用Python3通过以下命令运行vboxapisetup.py文件:

sudo python3 vboxapisetup.py install

您将收到此问题:

Traceback (most recent call last):
  File "vboxapisetup.py", line 90, in <module>
    main(sys.argv)
  File "vboxapisetup.py", line 63, in main
    raise Exception("No VBOX_INSTALL_PATH defined, exiting")
Exception: No VBOX_INSTALL_PATH defined, exiting

您可以直接编辑当前文件vboxapisetup.py,并将第57行vboxDest = os.environ.get("VBOX_MSI_INSTALL_PATH", None)替换为vboxDest = "/usr/lib/virtualbox"

然后重新开始:

sudo python3 vboxapisetup.py install

现在您会得到类似的东西:

running install
running build
running build_py
copying vboxapi/__init__.py -> build/lib/vboxapi
running install_lib
creating /usr/local/lib/python3.6/dist-packages/vboxapi
copying build/lib/vboxapi/__init__.py -> /usr/local/lib/python3.6/dist-packages/vboxapi
copying build/lib/vboxapi/VirtualBox_constants.py -> /usr/local/lib/python3.6/dist-packages/vboxapi
byte-compiling /usr/local/lib/python3.6/dist-packages/vboxapi/__init__.py to __init__.cpython-36.pyc
byte-compiling /usr/local/lib/python3.6/dist-packages/vboxapi/VirtualBox_constants.py to VirtualBox_constants.cpython-36.pyc
running install_egg_info
Removing /usr/local/lib/python3.6/dist-packages/vboxapi-1.0.egg-info
Writing /usr/local/lib/python3.6/dist-packages/vboxapi-1.0.egg-info

这意味着我们还可以安装vboxapi软件包!


现在,让我们再次尝试在python3中加载virtualbox():

from virtualbox import VirtualBox, Session, Manager, WebServiceManager
box = VirtualBox()

这可能会引发新问题:

Traceback (most recent call last):
  File "virtualbox_python3_test.py", line XX, in <module>
    vbox = virtualbox.VirtualBox()
  File "/usr/local/lib/python3.6/dist-packages/virtualbox/library_ext/vbox.py", line 22, in __init__
    manager = virtualbox.Manager()
  File "/usr/local/lib/python3.6/dist-packages/virtualbox/__init__.py", line 143, in __init__
    self.manager = vboxapi.VirtualBoxManager(mtype, mparams)
  File "/usr/local/lib/python3.6/dist-packages/vboxapi/__init__.py", line 989, in __init__
    self.platform = PlatformXPCOM(dPlatformParams)
  File "/usr/local/lib/python3.6/dist-packages/vboxapi/__init__.py", line 750, in __init__
    import xpcom.vboxxpcom
  File "/usr/lib/virtualbox/sdk/bindings/xpcom/python/xpcom/vboxxpcom.py", line 78, in <module>
    raise Exception('Cannot find VBoxPython module (tried: %s)' % (', '.join(_asVBoxPythons),))
Exception: Cannot find VBoxPython module (tried: VBoxPython3_6m, VBoxPython3m, VBoxPython)

如果您进行挖掘,则会在网上发现很多与此问题相关的问题(question 1question 2question 3question 4等)。 ..

但是根据我的研究和调查,如果您很幸运(并且拥有使用python3本机支持构建的Virtualbox),您可以尝试:

cd /usr/lib/virtualbox/
sudo cp VBoxPython3_5m.so VBoxPython3_6m.so

但是,如果出现以下错误:

cp: cannot stat 'VBoxPython3_5m.so': No such file or directory

这意味着您在Virtualbox中没有本地python3支持...

可以这样解决:

转到here并下载the python3-virtualbox-5.2.16 binary package(我们不在乎VirtualBox版本...)

现在打开python3-virtualbox-5.2.16-lp150.4.11.1.x86_64.rpm档案,将其浏览到/./usr/lib/virtualbox/,然后提取文件VBoxPython3_6m.so,然后将此文件拖放到当前工作目录中,然后从该目录中执行:

sudo cp VBoxPython3_6m.so /usr/lib/virtualbox/

现在,您可以为virtualbox使用python3绑定