我正在将Python3绑定用于virtualbox(pyvbox)。它与我的系统的初始python3版本3.7一起使用。现在,我想对python3.8使用完全相同的绑定。我已经安装了所有需要的python3.8软件包,但出现此错误:
$ python3
Python 3.8.0 (default, Oct 28 2019, 16:14:01)
[GCC 9.2.1 20191008] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import virtualbox
>>> _vbox = virtualbox.VirtualBox()
m=VBoxPython3_8 x=No module named 'VBoxPython3_8'
m=VBoxPython3 x=No module named 'VBoxPython3'
m=VBoxPython x=/usr/lib/virtualbox/VBoxPython.so: undefined symbol: _Py_ZeroStruct
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home//.local/lib/python3.8/site-packages/virtualbox/library_ext/vbox.py", line 22, in __init__
manager = virtualbox.Manager()
File "/home//.local/lib/python3.8/site-packages/virtualbox/__init__.py", line 145, in __init__
self.manager = vboxapi.VirtualBoxManager(mtype, mparams)
File "/usr/local/lib/python3.8/dist-packages/vboxapi/__init__.py", line 989, in __init__
self.platform = PlatformXPCOM(dPlatformParams)
File "/usr/local/lib/python3.8/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_8, VBoxPython3, VBoxPython)
我发现这些模块必须位于/usr/lib/virtualbox
中,该模块当前仅包含这些文件:
$ ls /usr/lib/virtualbox/ | grep VBoxPython
VBoxPython2_7.so
VBoxPython3_7m.so
VBoxPython.so
这些.so文件是通过virtualbox
软件包安装的。但是,我无法通过重新安装同时没有VBoxPython3.so
和VBoxPython3.8.so
。我查看了virtualbox代码,似乎c宏PY_VERSION_HEX
表示3.7而不是3.8,这可能是由于包含了错误的Python.h
标头引起的。
[如何强制virtualbox软件包包含/usr/include/python3.8/Python.h
而不是/usr/include/python3.7/Python.h
?
无法卸载python3.7。
pyvbox package docs(从pyvbox
重定向)表示它没有安装.so
文件。但是,他们确实注意到Python包依赖于VirtualBox SDK。反过来,建议将SDK手动安装到系统Python。那最新的消息似乎很危险,尤其是在外部软件包管理器中完成时,但也许他们更了解。
[四处寻找,我发现.so
文件归OS软件包virtualbox
所有。换句话说,virtualbox
必须安装有Python3.8支持。
# Who owns/provides this file (use your dist equivalent or duckduckgo)
$ yay -Fy /usr/lib/virtualbox/VBoxPython3_8.so
...
usr/lib/virtualbox/VBoxPython3_8.so is owned by community/virtualbox 6.1.6-1
我建议您重新安装virtualbox
软件包以进行分发。安装最新版本将提供最新的.so
库文件Virtualbox
支持。让我们测试一下理论
# Install Virtualbox and the Virtualbox SDK
yay -S virtualbox python-virtualbox
# Assert we aren't getting an error
$ python -c "import virtualbox; _vbox = virtualbox.VirtualBox(); print('Success!')"
Success!
否则,如果软件包不包含3.8支持,则必须确保自己编译,同时确保LD_LIBRARY_PATH
指向Python 3.8开发人员库。但是,我强烈建议不要这样做。与您的程序包管理器一起工作并从上游工作中受益绝对是更好的选择。
祝你好运!