python

pythonのsubprocessを使ったあれこれ あるいはsubprocess.runのすすめ

はじめに pythonでsubprocessを使ってあれこれする方法をイディオム的に覚えておくと便利なのでまとめておく。 できること(やろうとしていること)は以下 stdoutを文字列として受け取る 文字列をstdinとして渡す stdoutをiteratorとして受け取る (その前に)…

pytestのpluginどこまで使うか

はじめに pytestのpluginをどこまで使うかを考えるのがめんどくさくなったりした。 個人的にはそれぞれのタイミングで必要になったらはじめて手に取るべきで、あまり最初から導入するようなpluginは思いつかなかった。必要になったタイミングで追加して手に…

jqfpyにloadfile(),dumpfile()を追加していた

github.com loadfile(),dumpfile()がほしくなったので追加した。 jqfpy jqfpyは、 jsonをparseするためにDSLを覚えるのがめんどくさい(jq)。 各自自分の慣れた言語のワンライナーで十分なのでは? という発想のもとのpackage(自分はpython)。 重要なことは誰…

pypiの特定のpython packageを利用しているversionの割合を見てみる方法について

python2.xのサポートが2020-01-01T00:00:00でおわるということで、最近は drop python2 というようなissueも増えてきています(node-gypはどうするんでしょうね..)。 そのようなissueの中で、使われているversionの情報を調べて共有しくれたりする人がだいた…

環境変数で設定を管理したくなった場合のpython-dotenvのメモ

最近は設定ファイルだけではなく環境変数で設定を渡すことがけっこうある(コンテナ的な文脈だったり、12 factor app的な文脈だったり色々)。自前で頑張っても良いけれど。自分でコードを書かずに済ませたい。 何か良いライブラリは無いかなと探してみたらあ…

jsonschemaやopenAPI docのファイルを分解する機能を作った

github.com 背景 jsonschemaやopenAPI documentを触っている時に、時折、例としてあげられるファイルが巨大でインデントなどの対応を把握するのが辛くなることがある。 自分で書く場合には複数のファイルに分解された状態で書くので問題ないのだけれど。 手…

makefileにhelpを付けるワンライナー

makeファイルはデフォルトではhelpが存在しない。bashの補完の設定などを入れているとタブで利用可能なタスクの一覧が出る環境もあるが、その設定もしていない場合には利用可能なタスクの一覧も表示できない。 タスクに対するcommentの流派 似たようなことを…

横着な人のための逆引きpipでpackageをinstallするときの細かな試行錯誤のメモ

横着な人(自分)のためのpipのメモ。 試行錯誤のためのフレッシュな環境が欲しい 正に今がそれ。pipの実行を試すために /tmp/foo に仮想環境を作る。 $ mkdir -p /tmp/foo $ python -m venv /tmp/foo $ cd /tmp/foo activateせずに直接./bin/pipや./bin/pytho…

pythonでライブラリを使用せずにちょっとしたspinnerとprogress barを作る(CLI)

たまに欲しくなるのでメモ。やっていることはエスケープシークエンスでN行戻った行頭に移動して現在のカーソルから端末の終端までクリアを繰り返しているだけ。 progress bar ちょっとしたプログレスバーの表示。ふつうにやる分にはtqdmを使ったほうがお手軽…

joとの比較で負けている気になったのでmkdictにblockを入れてみた

github.com 昨日の記事でjoと比較してみたのだけれど。ネストが深いJSONを作るのは楽でも、同じ階層の複数フィールドに値をもたせたJSONを作るのが大変だった。癪だったのでblockという概念を導入してみた。 同じ階層に複数のフィールド 例えば以下の様なJSO…

joとdictknifeのmkdictを比べてみる

github.com jo JSONをコマンドラインから作るコマンド。 github.com joの例を翻訳してみる joのページにある例を翻訳してみる。 簡単な例。 $ jo name=Jane {"name":"Jane"} $ dictknife mkdict name Jane { "name": "Jane" } コマンドを使った例 $ jo time=…

pythonのasyncioでrun_in_executor()を使ってもブロックしてるように見えて上手く処理を逃がせないと感じたとき。

asyncioを使っていて、awaitableな関数群で構成されていないコードセットを無理やり非同期化してお茶を濁す時にrun_in_executor()が使われる。 ただしこのrun_in_executor()を使っても上手く処理を別スレッドに逃がせずという事態に陥ることもある。その理由…

標準ライブラリだけでpythonモジュールを設定ファイルとして使う方法のメモ

標準ライブラリだけでpythonモジュールを設定ファイルとして使う方法のメモ。importlibの関数を使う方法もあるけれど。たまたまrunpyというモジュールも発見したのでそれのメモ。 pythonモジュールを設定ファイルとして使う pythonモジュールを設定ファイル…

ネストした辞書(JSON)のマージについて考えるときに気にするのはリスト(Array)に対する操作かもしれない

github.com JSONのマージ dictknifeにはcatというサブコマンドがあり、これに複数のファイルを指定すると良い感じにマージしてくれる。 例えば以下のような2つのjsonをマージしてみる(mkdictはjoのようなコマンドラインでJSONをつくるための便利コマンド。フ…

jinja2のエラーメッセージを親切にする機能を付けてみて気づいたtemplate継承の複雑さ

過去の記事でCLI用のjinja2 wrapperを書いていたという話をした。この中でエラーメッセージを親切にするということに取り組んだことにも触れた。 この親切なエラーメッセージのテストのために、jinja2のtemplate継承を試してみた所、意外と複雑な機能だなー…

jinja2用のCLIのファイルパスの解決方法を変更した

github.com jinja2用のCLIのファイルパスの解決方法を変更した。 なぜファイルパスの解決方法を変更する必要があるのか? なぜファイルパスの解決方法を変更する必要があるのか?と言うと、デフォルトの解決方法ではコマンドの実行位置に依存してしまうため…

jinja2のCLIラッパーのエラー表示を良い感じにした

github.com jinja2のCLIラッパーのエラー表示を良い感じにした。元々最近余暇に元気がなくて機能を追加したりする気が起きなかったのだけれど。それを機会に自分の作っていたrepositoryのexamplesを整理していた。そのようなことをしている最中に幾つか気に…

pythonのformatterのblackに標準入力でコードを渡す。

hmm $ pip install black $ cat 00hello.py | black No paths given. Nothing to do なるほど。ファイルの指定を"-"にして渡す。 https://github.com/ambv/black/blob/250ba7f04b300df284ba80cd4bb4122b45b41efb/black.py#L465-L467 def reformat_one( src:…

JSONの$refを見て1つのファイルにまとめるコマンドを部分的に使えるようにした。

github.com JSONの$refを見て1つのファイルにまとめるコマンドを部分的に使えるようにした。OpenAPI documentなどを書くときに使う。 いままでは全部をまとめた形でしか使えなかった。 # いままで $ jsonknife bundle --src main.yaml $ jsonknife bundle -…

複数のresourceにループで触る時にcontextlib.ExitStackが便利という話。

複数のresourceにループで触る時にcontextlib.ExitStackが便利という話のメモ。 例えば以下の様な条件で動作する処理を書きたいことがあるとする。 対象となるresource(ファイルなど)を複数取る そのうちN行までを取り出す(それ以降は読まない) 取り出した行…

ipythonのシェルのpromptをpythonのシェルの表示に変える方法のメモ

はじめに ipythonは便利なのですが、実行例などを貼り付けるときには通常のpythonのシェルでの表現に揃えたかったりします。一方でipythonのpromptには実行回数的なものが併記されるなど通常のpythonとは異なる表示になっています。 ipythonのprompt表示 In …

設定ファイル(JSON)のdiffをjson patchでやってみようという試み

設定ファイル(JSON)のdiffを手軽に分かるようになるには?ということについての探訪の1つ。文字列的なdiffの場合に意図しない余分なdiffが発生したりしていた(sort keysしてpretty printしたJSONを使えば幾文かはマシになるけれど)。それ以外の表現は無いも…

最近の砂場でのpythonのサンプルコードの実行方法について

日記的なrepositoryを作っていて、何か調べたいことがあったときにそこにサンプルコードを書いて調べたりしている。そのサンプルコードの書き方でdebugとinfoの実行形態を分ける方法が便利だったのでメモ。 趣旨 この方法の趣旨は以下のような感じ。 通常は…

pyinspectというものを地味に作っている

github.com pyinspectというものを地味に作っている。まだrepository上には一切のドキュメントがないし正式なリリースをしたというわけでもないのでしばらくは個人用。 コードリーディングのお供に 元々の動機はコードリーディングをしようとしているときに…

jediでenvironmentを指定すると、1つの実行環境(venv)で複数の環境をサポートできる話

たしか以前jediのコードを読んだ時に特に環境(venv)毎にjediを入れ直さなくても済むはずという結論になった記憶。python-language-serverのコードを読んでいたタイミングでそういえば上手く考慮できていないのでは?と思うところがあったのでPRを出したりす…

pythonのCLIでリスト選択のUIにemacs/shell風のキーバインドを追加してみる

なんとなくCLIのツールを作ろうかと思って色々試してみていた。python-inquirerというものを発見したので使ってみていた。まだこれを常用するかは決めていない(元々inquirerはnode.js用のライブラリだった模様。それのpython版がこれ。yeomanなどに使われて…

pycommentというライブラリを作りました

github.com pycommentというライブラリを作くりました。 rubytoolsのxmpfilterに似たものをpythonでもやってみたいというやつです。 install installはいつもどおりpipで。 $ pip install pycomment how to use 使いかたはpycommentコマンドを使います。する…

datacalssesのインスタンスを含んだ値をJSONにするときのメモ

いつものやつです。対応していない値をjson.dumps()に与えるとTypeErrorが発生するやつです。 TypeError 例えばこういうdataclassを定義して。 from dataclasses import dataclass, asdict @dataclass class Point: x: int y: int json.dumpsするとTypeError…

pythonのprint()をlogger.infoに変える黒魔術(loggedpy)

github.com pythonのprint()をlogger.infoに変える黒魔術(loggedpy)を実装してみた(土日)。 発端はこのtweet。 printをそのままログに出せる方法あった気がするけどなんだっけ…気のせいかな…— altnight (@altnight) September 13, 2018 意外とやってみると…

pythonで複数のhttp requestを同時に投げる方法(requests)について

時折、ちょっとしたスピードアップにhttp(https) requestを並列で投げたい場合がある。aiohttpなどを使っても良いが既存のコードを書き換えるのもめんどくさい。そのようなときの方法のメモ。 concurrent.futuresを使う方法も考えられるけれど。今回はasynci…