Как заставить привязки virtualbox python работать с выбранной версией Python? - PullRequest
1 голос
/ 24 апреля 2020

Я использую 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 при переустановке. Я посмотрел на код виртуальной коробки, и кажется, что макрос 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 не вариант.

1 Ответ

2 голосов
/ 29 апреля 2020

Документы 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 dev. Но я настоятельно рекомендую против этого. Бесконечно лучше работать вместе с вашим менеджером пакетов и получать выгоду от основной работы.

Удачи!

...