2017-11-19 2 views
1

私は最後の数日でPython3でlibtorrentをインストールしようとしました。どんなに私がしようとするもの、私が手:libtorrentは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' 

私が実行したときに、私はエラーを取得していない:

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

私は本当にlibtorrent、およびlibtorrent-rasterbarの違いを理解していません。私が知る限り、ラスターバーはlibtorrentの依存関係です。

PyPi pageにはバイナリがありませんので、私はpip installできません。

私は実行することにより、そのようにthe GitHub pageからパッケージをダウンロードしてインストールすることができます。

$ 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と同様の結果が得られたので、受け入れられた回答は確定的なNOです。しかし、それ以来、それを達成する方法についての指示がない限り、それが可能になっているという最近のコメントがあります。

私は徹底的にアイデアを使い果たしています。どんなにばかげても、どんな提案もありません。今、GitHubページからパッケージを探して、プロジェクトディレクトリにコードをコピーしてローカルモジュールとしてインポートすることができるかどうかを確認していますが、これまではあまり運がありません。それがうまくいかない場合は、オリジナルのC++ libtorrentライブラリのPython3ラッパーを作成します。しかし、私はどこか他の誰かがこれで試して失敗したので、私は成功を期待していないと読んでいます。

EDIT:

さて、私は少しさらに得ています。私はどうにかして、設定ファイルやmakefileを持たないレポのバージョンをダウンロードすることができました。今、私は右のいずれかを持っていることを、私が実行します。

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

は、私はこれをGoogleで検索し、明らかにPyClass_Typeはのpython3で定義されていません。だから、それはまだPython2のためにそれ自身を構築しようとしているようですが、それはlibboost_python-py27.soをImportErrorに説明しています。推奨される解決策は、-lboost_pythonの代わりに-lboost_python3でC++ライブラリをコンパイルすることでした。 (それが再びlboost-のpythonを使用するためにMakefileを戻しますので、私は$ ./configure --enable-python-binding再実行することはできません)

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

:メイクファイルの行268はので、私はBOOST_PYTHON_LIB = -lboost_python3と再-RANにそれを変更しBOOST_PYTHON_LIB = -lboost_pythonです。残念ながら、私はまだ同じエラーメッセージ:undefined symbol: PyClass_Typeを取得します。私はC++については何も知らないので、ライブラリをコンパイルすることについて本当に明白なものがないかどうかはわかりません。

+2

libboost_python-py27.so.1.62.0の "27"はPythonバージョン2.7を指します。 Python 3.xのためにboost-pythonを構築する必要があります。 – Arvid

+0

@Arvidという回答に感謝します。私はhttp://www.boost.org/からboostをダウンロードし、ここの手順に従って作成しました:https://eb2.co/blog/2012/03/building-boost.python-for-python-3.2/ 'project-config.jam'は私のpythonのパスを' 'python:3.6:/ home//anaconda3;を使用しているので、私はそれを変更する必要はないと思います。私はその後、libtorrentを構築するコマンドを再実行しました。残念ながら、私はまだ同じエラーが発生します。 – Sam

+0

btw、あなたはlibtorrentデベロッパーですか?私はトラブルシューティングをしていたので、libtorrentについての多くの質問にあなたの記事を見ました。トレント関連のもののような完全なライブラリを構築してくれてありがとう。彼らはそれを構築した後に人々を助け続ける開発者を持つことは素晴らしいことです。私はそれを働かせることができれば言うまでもありませんが、あなたは私を助けてくれました。しかし、もっとクレイジーなバージョンを一緒にハックするのに何週間もかかります。 – Sam

答えて

2

さて、私はそれを解決しました。私はPython3の2つの別個のインストールがあったことが分かります。デフォルトのものとAnacondaのものです。さらに、Anacondaをインストールしたときに、自分自身を$PATH環境変数に追加させました。私はピップなどでパッケージをインストールすることができたので、デフォルトのインストールを使用していなかったことに気づいていませんでした。基本的に、純粋なPythonのものは問題なく動作しました。しかし、libtorrentはC++ライブラリの上にあるPythonラッパーなので、$ ./configure --enable-python-bindingを実行するとPythonのすべてのビットをAnaconda Pythonのインストールに組み込み、すべてのC++のビットをデフォルトのPythonのインストール(またはそのようなもの、 。 $ sudo rm -rf ~/anaconda3、および$PATH変数アナコンダは、私はまた、$ sudo apt-get remove D「と$ sudo apt-get purge」libtorrentを行うには何も持っていた私がインストールされていたすべてのライブラリをdは私の.bashrc .FOR良い指標に設定し、削除します

ソリューションは、アナコンダをアンインストールすることでした。私はそれらのすべてを覚えることはできませんが、間違いなくpython3-libtorrent,python-libtorrent,python3-libboost、およびpython-libboostが含まれています。私がそれをやったなら、単純な$ sudo apt-get install python3-libtorrentは完璧に働いています。

ただ、サイドノートとして@Arvid、から変更する必要python exampleでprint文の私にとっては、少なくとも最後の行:単純に

s.num_peers, state_str[s.state]) 

s.num_peers, s.state) 

s.stateは、state_strリストにマップする必要があった整数ではなく、状態を表す文字列を保持していたためです。これは、Python3がどのように状態を処理するかの単なる結果かもしれません。私はPython2でそれをテストしていません。

関連する問題