python-3.x - 如何让 virtualbox python 绑定与所选的 Python 版本一起使用?
问题描述
我正在为 virtualbox (pyvbox) 使用 Python3 绑定。它适用于我系统的初始 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包文档(重定向自pyvbox
)暗示.so
文件不是由它安装的。但是,他们确实注意到 Python 包依赖于VirtualBox SDK。反过来,建议手动将 SDK 安装到系统 Python。最新的似乎令人讨厌,尤其是在包管理器之外完成时,但也许他们知道得更好。
四处挖掘,我发现这些.so
文件归操作系统包所有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 virtualbox-sdk 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 开发库。但是,我强烈建议不要这样做。与您的包经理一起工作并从上游工作中受益是无限好。
祝你好运!
推荐阅读
- reactjs - Mobx 未更新数组中的更改
- javascript - 我尝试将 react doc 代码重写为 react-create-app 中的类组件,但如果行为不正常
- css - 闪亮应用程序中的 tabsetPanel 样式
- google-apps-script - 其他文件的 Google 工作表组行模板
- html - 在 Jquery 中动态地克隆和删除元素
- python - 随机化而不重复
- amazon-web-services - 使用单个 IP 地址的 AWS EC2 多实例退出
- ethereum - 当我用“var”创建一个变量时,我得到一个声明错误
- reactjs - Form.Control 上的 ReactJS 多选不标记选定对象
- javascript - 嵌套三元条件在 useEffect 钩子中不工作