libtorrent 在 Python 3 中工作吗?

Does libtorrent work in Python 3?

我在过去几天尝试了所有方法来在 Python3 中安装 libtorrent。无论我尝试什么,我都会得到:

Python 3.6.3 |Anaconda, Inc.| (default, Oct 13 2017, 12:02:49) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import libtorrent
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'libtorrent'

当我 运行:

时没有错误
$ sudo apt-get install python3-libtorrent
$ sudo apt-get install libtorrent-rasterbar-dev

我不太明白 libtorrent 和 libtorrent-rasterbar 之间的区别。据我所知,rasterbar 是 libtorrent 的依赖项。

PyPi page 上没有任何二进制文件,所以我不能 pip install

我可以从 the GitHub page 下载软件包并通过 运行ning 安装它:

$ python setup.py build
$ python setup.py install

创建:

/home/<user>/anaconda3/lib/python3.6/site-packages/python_libtorrent-1.1.5-py3.6.egg-info

但还是没有变化。这可能与我的 Python3 安装不在默认位置有关,但我不确定在安装 libtorrent 方面如何处理。

我还发现 this 类似的 SO 问题,其中接受的答案是明确的“否”。然而,最近有更多的评论说,从那时起,它已经成为可能,只是没有给出如何实现它的说明。

我完全 运行 没有想法,无论多么荒谬,我都乐于接受任何建议。现在,我正在查看从 GitHub 页面获得的包,看看我是否可以以某种方式将代码复制到我的项目目录中,然后将其作为本地模块导入,但我没有太多到目前为止的运气。如果这不起作用,我会考虑为原始 C++ libtorrent 库编写自己的 Python3 包装器。但是,我在某处读到其他人尝试过但失败了,所以我并不期待成功。

编辑:

好的,我说得更进一步了。我以某种方式设法下载了一个没有配置文件或任何 makefile 的 repo 版本。既然我有合适的,我 运行:

$ ./configure --enable-python-bindings
$ make
$ python setup.py build
$ python setup.py install
$ python 
Python 3.6.3 |Anaconda, Inc.| (default, Oct 13 2017, 12:02:49) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import libtorrent
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.62.0: undefined symbol: PyClass_Type

我用谷歌搜索了一下,显然 PyClass_Type 没有在 Python3 中定义。所以它似乎仍在尝试为 Python2 构建自己,这解释了 ImportError 中的 libboost_python-py27.so。建议的解决方案是使用 -lboost_python3 而不是 -lboost_python 来编译 C++ 库。 Makefile 的第 268 行是 BOOST_PYTHON_LIB = -lboost_python 所以我将其更改为 BOOST_PYTHON_LIB = -lboost_python3 并重新 运行:

$ make
$ python setup.py build
$ python setup.py 

(我无法重新 运行 $ ./configure --enable-python-binding 因为它会将 Makefile 还原为再次使用 lboost-python)。不幸的是,我仍然收到相同的错误消息:undefined symbol: PyClass_Type。我对 C++ 几乎一无所知,所以我不确定我是否遗漏了一些关于编译库的非常明显的东西。

好的,我已经解决了。原来我有两个单独的 Python3 安装。默认一个,Anaconda 一个。此外,当我安装 Anaconda 时,我让它自己添加到我的 $PATH 环境变量中。我没有注意到我没有使用默认安装,因为我仍然可以通过 pip 等安装软件包。基本上,纯粹的 Python 工作正常。但是,由于 libtorrent 是 C++ 库之上的 Python 包装器,因此 运行 $ ./configure --enable-python-binding 为我的 Anaconda Python 安装构建了所有 Python 位,以及所有C++ 位到我的默认 Python 安装(或类似的东西,据我所知)。

解决方案是卸载 Anaconda:$ sudo rm -rf ~/anaconda3,并删除我 .bashrc 中设置的 $PATH 变量 Anaconda。为了更好的衡量,我也 $ sudo apt-get remove' $ sudo apt-get purge 我安装的每个库都与 libtorrent 有关。我不记得所有这些,但肯定包括 python3-libtorrentpython-libtorrentpython3-libboostpython-libboost。一旦我这样做了,一个简单的 $ sudo apt-get install python3-libtorrent 就让它完美地工作了。

@Arvid,作为旁注,对我来说,至少 python example 中打印语句的最后一行需要更改为:

s.num_peers, state_str[s.state])

简单地说:

s.num_peers, s.state)

因为 s.state 保存的是表示状态的字符串,而不是需要映射到 state_str 列表的整数。不过,这可能只是 Python3 处理状态的结果;我还没有在 Python2.

中测试过它