如何在 Anaconda 中使用 Python Dbus 绑定
Posted
技术标签:
【中文标题】如何在 Anaconda 中使用 Python Dbus 绑定【英文标题】:How to use Python Dbus bindings in Anaconda 【发布时间】:2018-06-01 10:57:54 【问题描述】:我正在尝试在 Anaconda python 环境中安装 dbus,但我正在苦苦挣扎。
这是我收到的错误消息:
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 在系统 python 上工作正常,但在 Anaconda Python 上不工作。
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
>>>
Python 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
>>>
谁能帮帮我?我在这里遗漏了一些明显的东西吗?
提前致谢。
【问题讨论】:
【参考方案1】:我也有类似的问题,很少有 dbus 和 python don't work well out-of-the-box 的情况。共识似乎是您需要系统级安装(即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 tarball 的内容时,这很有意义https://anaconda.org/conda-forge/dbus,因为它都是 C 文件和可执行文件。我不确定它应该是dbus
python 模块,但我可能是错的。
编辑:
我搜索了 conda 存储库,发现一些人上传了 dbus-python 版本,大概是他们编译和安装的。我通过以下方式在 py3.6 conda 环境中尝试了this one:
conda install -c scottwales dbus-python
然后我就可以导入 dbus。这是一种 hacky 方法,不应该在生产中使用,我建议听 Carlos Cordoba 的帖子如下。但是如果您现在需要解决方案,请搜索一些用户 conda 包或尝试自己编译库。
【讨论】:
【参考方案2】:谁能帮帮我?我在这里遗漏了什么明显的东西吗?
是的,你是。关于conda
,人们仍然不明白一件事:conda
不是 pip
的替代品。它是一个通用的包管理器,与apt-get
、yum
、brew
、emerge
等类似,但跨平台并基于 Python。
在这种情况下,这意味着 conda install dbus
没有安装 Python Dbus 绑定,正如您对 pip
所期望的那样。它安装了 Qt 5 所需的 Dbus C 包本身(同样是 C++ 库,而不是与其绑定的 Python)。
很遗憾,dbus-python
没有 Conda 软件包。更糟糕的是,正如here 指出的那样,似乎没有简单的方法为其创建包。
最后,你说
这是我收到的错误消息
该错误的(最可能的)原因是因为您将系统 Python dist-packages
路径添加到 Anaconda 的 PYTHONPATH
,或者因为您盲目地将 dbus
模块从系统 Python 复制到 Anaconda。请不要再这样做了。系统 Python 和 Anaconda 包使用不同的编译器在不同的条件下编译。所以混合它们是导致无法理解的错误的原因,就像你报告的那样。
【讨论】:
以上是关于如何在 Anaconda 中使用 Python Dbus 绑定的主要内容,如果未能解决你的问题,请参考以下文章