LoginSignup
1
2

More than 3 years have passed since last update.

pythonのパッケージにパッチを当てた記録

Posted at

俺は悪い子なんだ

注: この記事はそれなりにニッチです

使っているpythonパッケージに無い機能が欲しくてたまらなかった。
時に研究者は他人の使わないような物を用意せねばならぬのだ。
しかし、その機能はニッチなもで1プルリクしたって受け取られるわけがないのだ。
だからパッチを作成した。

自前patch?gitじゃ駄目なん?

ご存知の通り、UNIX系にはpatchというコマンドがある。これを用いる。
gitでいいけど、論文に「変な変更はしてないぽよ。差分はここだけぽよ。」って書きたかった(重要)。

作成手順

git diffをすることによって自分やった変更を出力できる。
だから、patchの作成のためだけにgitを使う。歴史を巻き戻せるのも良い。
というわけで、結局gitは使うのだけれどね。

まず、編集するために、使っているパッケージのソースコードの元に飛かねばならなかった。
仮想環境だろうがどこだろうが、ワンライナーで行ける。下記のhogeを書き換えて飛んでいった。

cd $(python -c "import hoge as target; from pathlib import Path; print(Path(target.__file__).parent)")

で、編集する前に、一応git管理しておく。

git init
git add *
git commit
git branch patch
git checkout patch
vim hoge.py

git add *はキャッシュまで含んでしまうかもなので、まぁ、そこは適切に。
僕はvimmerなのでvimで編集しているが、もちろんvimじゃなくていい。変更し終わったらdiffする。

mkdir ~/warui_patch
git diff > ~/warui_patch/complex.patch

これでパッチの作成は終了だ。

ソースコード

以下、さっきのパッチをパッケージに当てるためのシェルスクリプトだ。
下記ではmneパッケージに、さっき作成したcomplex.patchを当てている。
オプションをいくつかつけている。

  • -R: パッチを戻す
  • -p: 該当のパッケージのパスを表示する
  • -h: ヘルプ

この、該当のパッケージのパスを表示するのは、僕が何か編集したい時に

cd $(sh ./patcher -p)

として、該当パッケージのもとにひとっ飛びできるようにするためのオプションだ。
当然仮想環境でも鉄の意志で飛んでいくぞ。

#!/usr/bin/env sh
OPT=$1
PACKAGE='mne'
PATCH='complex.patch'

make_python_path_code () {
  echo "import $PACKAGE; from pathlib import Path; print(Path($1.__file__).parent)"
}

make_python_path () {
  echo "$(python -c "$(make_python_path_code $1)")/"
}

patch_python () {
  patch $OPT -u -p 1 -d $(make_python_path $1) < $2
}

if [ "$1" = "-h" ]; then
  echo Patch script for python.
  echo ========================
  echo -h: Show this message
  echo -R: Reverse patch
  echo -p: Print script dir
  exit
fi
if [ "$1" = "-p" ]; then
  echo $(make_python_path $PACKAGE)
  exit
fi
patch_python $PACKAGE $PATCH

感想

研究のためとはいえ、本当はパッケージの書き換えなんか、やりたくない。
辛い…(´・ω・`)


  1. 脳波をWavelet変換して複素数から絶対値の平均を算出し、脳内での脳波の大きさを推定したかったが、俺は絶対値の平均じゃなくて複素数が欲しかったのだ。平均しないぶんだけ、計算コストはヤバくなる。 

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2