2017-11-19 2 views
1

Ich habe in den letzten Tagen alles versucht, um libtorrent in Python3 zu installieren. Egal, was ich versuche, erhalte ich:Funktioniert libtorrent in Python 3?

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' 

ich keine Fehler, wenn ich laufen:

$ sudo apt-get install python3-libtorrent 
$ sudo apt-get install libtorrent-rasterbar-dev 

Ich verstehe nicht wirklich den Unterschied zwischen libtorrent und libtorrent-rasterbar. Soweit ich das beurteilen kann, ist die Rasterbar eine Abhängigkeit von libtorrent.

Die PyPi page hat keine Binärdateien auf, so kann ich nicht pip install es.

kann ich das Paket von the GitHub page herunterladen und es auf diese Weise installieren, indem Sie:

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

Welche schafft:

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

Aber immer noch keine Veränderung. Es kann etwas damit zu tun haben, dass meine Python3-Installation nicht an einem Standardspeicherort ist, aber ich bin mir nicht sicher, wie ich das bei der Installation von libtorrent handhaben soll.

Ich fand auch ähnlich SO Frage, wo die angenommene Antwort eine endgültige NO ist. Es gibt jedoch neuere Kommentare, die besagen, dass dies seither möglich ist, außer dass keine Anweisungen dazu gegeben werden, wie dies zu erreichen ist.

Ich habe keine Ideen mehr und bin offen für irgendwelche Vorschläge, egal wie lächerlich. Im Moment schaue ich durch das Paket, das ich von der GitHub-Seite bekommen habe, um zu sehen, ob ich den Code irgendwie in mein Projektverzeichnis kopieren und dann als lokales Modul importieren kann, aber ich habe bisher nicht viel Glück. Wenn das nicht funktioniert, werde ich meinen eigenen Python3-Wrapper für die ursprüngliche C++ - Bibliothek libtorrent schreiben. Ich habe jedoch irgendwo gelesen, dass jemand anderes versucht hat und versagt hat, also erwarte ich keinen Erfolg.

EDIT:

Okay, ich habe ein wenig weiter gekommen. Irgendwie gelang es mir, eine Version des Repos herunterzuladen, die keine Konfigurationsdatei oder Makefiles enthielt. Nun, da ich das Recht haben, ein, ich laufe:

$ ./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 

ich diese gegoogelt, und anscheinend PyClass_Type nicht in Python3 definiert. Es scheint also, dass es immer noch versucht, sich selbst für Python2 zu bauen, was die libboost_python-py27.so im ImportError erklärt. Die vorgeschlagene Lösung bestand darin, die C++ - Bibliotheken mit -lboost_python3 anstelle von -lboost_python zu kompilieren. Linie 268 des Makefiles ist BOOST_PYTHON_LIB = -lboost_python so habe ich es zu BOOST_PYTHON_LIB = -lboost_python3 und wieder ran:

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

(Ich kann nicht erneut ausgeführt $ ./configure --enable-python-binding, weil es das Makefile kehrt lboost-Python wieder zu verwenden). Leider bekomme ich immer noch die gleiche Fehlermeldung: undefined symbol: PyClass_Type. Ich weiß fast nichts über C++, also bin ich mir nicht sicher, ob ich etwas wirklich Offensichtliches über das Kompilieren der Bibliothek verpasse.

+2

die "27" in libboost_python-py27.so.1.62.0 bezieht sich auf Python-Version 2.7. Sie müssen Boost-Python für Python 3.x sowie – Arvid

+0

gebaut haben Danke für die Antwort @Arvid. Ich heruntergeladen Boost von http://www.boost.org/ und baute es nach den Anweisungen hier: https://eb2.co/blog/2012/03/building-boost.python-for-python-3.2/ der 'project-config.jam' hat meinen Python-Pfad als' using python: 3.6:/home//anaconda3; 'aufgelistet, also glaube ich nicht, dass ich es ändern muss. Ich habe dann die Befehle zum Erstellen von Libertorrent erneut ausgeführt. Leider bekomme ich immer noch den gleichen Fehler. – Sam

+0

BTW, du bist der Libertorrent-Entwickler, oder? Ich habe deine Beiträge zu vielen SO-Fragen zu Libertorrent gesehen, als ich mich um die Fehlersuche gekümmert habe. Vielen Dank für den Aufbau einer solchen kompletten Bibliothek für Torrent-ähnliche Sachen. Es ist großartig, einen Entwickler zu haben, der den Leuten weiterhilft, nachdem sie ihn erstellt haben. Ganz zu schweigen davon, ob ich es funktioniere, du wirst mich gerettet haben, aber viele Wochen würde es dauern, um eine weit Cracker Version zu hacken – Sam

Antwort

2

Okay, ich habe es gelöst. Es stellte sich heraus, dass ich zwei separate Python3-Installationen hatte. Der Standard und der Anaconda. Außerdem habe ich bei der Installation von Anaconda die Umgebungsvariable $PATH hinzugefügt.Ich hatte nicht bemerkt, dass ich die Standardinstallation nicht verwendete, weil ich immer noch in der Lage war, Pakete über Pip usw. zu installieren. Grundsätzlich funktionierte alles, was reines Python war. Da libtorrent jedoch ein Python-Wrapper über einer C++ - Bibliothek ist, laufen $ ./configure --enable-python-binding alle Python-Bits in meiner Anaconda Python-Installation, und alle C++ - Bits in meiner Standard-Python-Installation (oder so ähnlich, von dem, was ich sagen kann) .

Die Lösung wurde zu Anaconda deinstallieren: $ sudo rm -rf ~/anaconda3 und löschen die $PATH Variable Anaconda gesetzt in meinem .bashrc .Für eine gute Maßnahme auch ich, $ sudo apt-get remove ‚d und $ sudo apt-get purge‘ Jede Bibliothek d hatte ich installiert, was mit libtorrent zu tun hatte. Ich kann mich nicht an alle erinnern, aber es enthielt definitiv python3-libtorrent, python-libtorrent, python3-libboost und python-libboost. Sobald ich das getan hatte, funktionierte eine einfache $ sudo apt-get install python3-libtorrent perfekt.

s.num_peers, state_str[s.state]) 

einfach:

@Arvid, nur als Randnotiz, für mich zumindest die letzte Zeile der print-Anweisung in der python example benötigt, um aus geändert werden

s.num_peers, s.state) 

seit s.state hielt eine Zeichenfolge, die den Zustand darstellt, keine Ganzzahl, die der state_str-Liste zugeordnet werden musste. Das könnte nur eine Konsequenz davon sein, wie Python3 Zustände behandelt. Ich habe es nicht in Python2 getestet.