月別アーカイブ: 2019年3月

ライブラリのコードを理解するための環境整備

はてなブログに引っ越しましたので、そちらをご参照下さい
https://threecourse.hatenablog.com/entry/%3Fp%3D1186

=================

目的

xgboost等のPythonからC++を呼び出すライブラリの理解のため、printデバッグや改造をできるようにする

環境

Windowsなので、GCPでlinuxのインスタンスを立ち上げる。
CLion/Pycharmのリモート機能を利用する。(ローカルの方が楽だけどやむを得ない)

やること

1. コードを落とし、C++でコンパイルできることを確認する

git clone –recursive https://github.com/dmlc/xgboost
cd xgboost; make -j4

2. 読むべきPythonコード/C++コードのフォルダを確認する

xgboostの場合は以下のフォルダ。
Pythonコード: python-package
C++コード: src, include
どうやって読むべきフォルダを確認するか良く分からないのですが、Makefileを読む/雰囲気くらいか。

3. (pipなどでインストールしたものでない)対象のPythonライブラリを呼び出す

呼び出し元となるpythonスクリプトを作り、そこで
import sys
sys.path.insert(0, my_library_path)
とすると、対象のパスから優先的に読み込むことができる。

4. (pipなどでインストールしたものでない)対象のC++ライブラリを呼び出す

どのようにPythonからC++ライブラリを呼び出すかをまず確認する。
xgboostの場合は、python-package/xgboost/core.pyの_load_libメソッドでctypes.cdll.LoadLibraryにより呼び出している。
ここでライブラリのパスはpython-package/xgboost/libpath.pyのfind_lib_pathメソッドで取得している。
対象の相対パスは含まれているので、pipなどでインストールしたライブラリが読み込まれないよう、dll_path = dll_path[:-1]などとすれば良い。

5. 動作確認

確認対象のpythonモジュールが読み込まれているか、C++ライブラリが読み込まれているかをprintやstd::coutを差し込むことで確認する。