libtorrent在Python3中工作吗



在过去几天里,我已经尝试了在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页面上没有任何二进制文件,所以我无法pip install它。

我可以从GitHub页面下载软件包,并通过运行进行安装

$ 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时处理这一问题。

我也发现了这个类似的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时,我让它将自己添加到我的$PATH环境变量中。我没有注意到我没有使用默认安装,因为我仍然可以通过pip等安装软件包。基本上,纯Python的东西运行良好。然而,由于libtorrent是C++库之上的Python包装器,因此运行$ ./configure --enable-python-binding将所有Python位构建到我的Anaconda Python安装中,并将所有C++位构建到默认的Python安装中(或者类似的东西,据我所知)。

解决方案是卸载Anaconda:$ sudo rm -rf ~/anaconda3,并删除.bashrc中的$PATH变量Anaconda集。为了更好地衡量,我还将$ sudo apt-get remove'd和$ sudo apt-get purge'd与libtorrent有关的所有已安装库。我记不清了,但肯定包括python3-libtorrentpython-libtorrentpython3-libboostpython-libboost。一旦我做到了,一个简单的$ sudo apt-get install python3-libtorrent就可以完美地工作。

@Arvid,顺便说一句,对我来说,python示例中print语句的最后一行至少需要从以下内容更改:

s.num_peers, state_str[s.state])

简单地说:

s.num_peers, s.state)

由于s.state持有表示状态的字符串而不是需要映射到state_str列表的整数。不过,这可能只是Python3如何处理状态的结果;我还没有在Python 2中测试过它。

最新更新