我正在尝试使用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
答案 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 1,question 2,question 3,question 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绑定!