Как использовать привязки Python Dbus в Anaconda

Я пытаюсь установить dbus в среде Python Anaconda, и я борюсь.

Вот сообщение об ошибке, которое я получаю:

e@gateway:~$ python
Python 3.5.4 |Anaconda custom (64-bit)| (default, Oct 13 2017, 11:22:58) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dbus
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/e/anaconda3/lib/python3.5/site-packages/dbus/__init__.py", line 77, in <module>
    import dbus.types as types
  File "/home/e/anaconda3/lib/python3.5/site-packages/dbus/types.py", line 6, in <module>
    from _dbus_bindings import (
ImportError: /home/e/anaconda3/lib/python3.5/site-packages/_dbus_bindings.so: undefined symbol: _Py_ZeroStruct
>>> 

Вот некоторые из выводов, которые, я думаю, могут быть заданы:

e@gateway:~$ conda install dbus
Fetching package metadata ...........
Solving package specifications: .

# All requested packages already installed.
# packages in environment at /home/e/anaconda3:
#
dbus                      1.10.22              h3b5a359_0  


e@gateway:~$ sudo apt-get install libdbus-glib-1-dev libdbus-1-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libdbus-glib-1-dev is already the newest version (0.106-1).
libdbus-1-dev is already the newest version (1.10.6-1ubuntu3.3).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.


e@gateway:~$ sudo apt-get install dbus
Reading package lists... Done
Building dependency tree       
Reading state information... Done
dbus is already the newest version (1.10.6-1ubuntu3.3).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.


e@gateway:~$ which python
/home/e/anaconda3/bin/python


e@gateway:~$ conda --version
conda 4.3.31

e@gateway:~$ sudo /home/e/anaconda3/bin/python -m pip install dbus-python
The directory '/home/e/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/e/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied: dbus-python in ./anaconda3/lib/python3.5/site-packages

DBus отлично работает на системном питоне, но не работает на Anaconda Python.

Питон 2.7:

e@gateway:~$ which python
/usr/bin/python
e@gateway:~$ python
Python 2.7.12 (default, Nov 20 2017, 18:23:56) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dbus
>>> 

Питон 3.5:

e@gateway:~$ which python3
/usr/bin/python3
e@gateway:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dbus
>>> 

Может кто-нибудь помочь мне? Я пропустил что-то явно очевидное здесь?

Заранее спасибо.


person A Saxena    schedule 19.12.2017    source источник


Ответы (2)


У меня были похожие проблемы, есть несколько случаев, когда dbus и python не работают должным образом. коробка. Похоже, консенсус заключается в том, что вам нужна установка на системном уровне (т.е. apt-get), чтобы заставить dbus работать. Я считаю, что ошибка /home/e/anaconda3/lib/python3.5/site-packages/_dbus_bindings.so: undefined symbol: _Py_ZeroStruct, которую вы видите, напрямую связана с этим.

conda install dbus ничего не добавляет в ~/anaconda3/lib/python3.6/site-packages, но вместо этого, кажется, устанавливает некоторые исполняемые файлы в ~/anaconda3/bin/, такие как dbus-run-session, dbus-daemon и т. д. Это имеет некоторый смысл, когда вы анализируете содержимое архива dbus https://anaconda.org/conda-forge/dbus, так как это все C-файлы и исполняемые файлы. Я не уверен, что это должен быть модуль Python dbus, но я могу ошибаться.

РЕДАКТИРОВАТЬ:

Я просмотрел репозитории conda и нашел несколько человек, которые загрузили версию dbus-python, предположительно, которую они скомпилировали и установили. Я попробовал этот в среде conda py3.6 через:

conda install -c scottwales dbus-python

Затем я смог импортировать dbus. Это хакерский подход, и его не следует использовать в продакшне, я бы рекомендовал послушать сообщение Карлоса Кордобы ниже. Но если вам нужно решение сейчас, поищите среди пользовательских пакетов conda или попробуйте скомпилировать библиотеку самостоятельно.

person David Vitale    schedule 08.01.2018

Может кто-нибудь помочь мне? Я пропустил что-то явно очевидное здесь?

Да Вы. Есть одна вещь, которую люди до сих пор не понимают в отношении conda: conda не является заменой pip. Это общий менеджер пакетов в том же духе, что и apt-get, yum, brew, emerge и т. д., но кроссплатформенный и основанный на Python.

В данном случае это означает, что conda install dbus не устанавливает привязки Python Dbus, как можно было бы ожидать от pip. Он устанавливает сам пакет Dbus C, необходимый для Qt 5 (опять же, библиотека C++, а не привязки к ней Python).

К сожалению, нет пакетов Conda для dbus-python. Что еще хуже, кажется, что нет простого способа создать для него пакеты, как указано здесь.

Наконец, вы сказали

Вот сообщение об ошибке, которое я получаю

(Наиболее вероятная) причина этой ошибки заключается в том, что вы добавили системный путь Python dist-packages в PYTHONPATH Anaconda или потому, что вы слепо скопировали модуль dbus из системного Python в Anaconda. Пожалуйста, никогда больше так не делай. Системные пакеты Python и Anaconda компилируются разными компиляторами и в разных условиях. Таким образом, их смешивание является причиной непонятных ошибок, таких как та, о которой вы сообщили.

person Carlos Cordoba    schedule 09.01.2018