テクめも

プログラミング関連のちょっとしたTipsなどを書いています。

Python

不要なPythonライブラリを一括で削除するワンライナー

誤ってグローバル環境など別の環境にライブラリをインストールしたとき、依存関係でインストールされるものもあるので一つづつ削除するのは面倒です。 そこで、次のコマンドで一括で削除できます。 pip list --format json | jq '.[] | select((contains({na…

pipのキャッシュをクリアする

pip 20.1以降であれば pip cacheが使用でき、以下のコマンドでキャッシュをクリアできます。 pip cache purge それ以前のバージョンであれば、手動で削除できます。 # MacOSの場合 rm -r ~/Library/Caches/pip # Linuxの場合 rm -r ~/.cache/pip 参考 stacko…

S3からファイルに保存せずに画像を読み込む

S3に保存した画像ファイルをプログラム中で使用したいシナリオを多いかと思います。 一度ファイルに保存して、保存したファイルを読み込む方法もありますが、保存せずに利用する方法を紹介したいと思います。 from io import BytesIO import boto3 import nu…

pytestで複数の条件を組み合わせたテストする

pytestでは、parametrizeを使うと、条件を変えてテストすることができます。 以下の例では、x=0、x=1とx=2の3パターンがテストされます。 @pytest.mark.parametrize("x", [0, 1, 2]) def test_foo(x): pass ここに、flag=True/Falseも条件に加えたいとします…

Pythonツールの設定ファイルまとめ

ツール名 pyproject.toml setup.cfg tox.ini 独自 flake8 NG #428 OK OK .flake8 black OK NG NG yapf NG #708 OK NG .style.yapf mypy NG #5205 OK NG mypy.ini isort OK OK OK .isort.cfg bandit NG #550 NG #212 NG .bandit pytest NG #1556 OK OK pytest…

lambda-uploaderで環境変数を上書きしない

lambda-uploaderを用いると、PythonのコードをAWS Lambdaに簡単にアップロードできます。 lambda-uploader myfunc 設定はlambda.jsonに書かれている内容が反映されます。 環境変数はGitで管理したくないので、lambda.jsonに書かないケースも多いかと思います…

Pythonで優先度付きキューを使う

Pythonでの優先度付きキューはheapqを使うとできます。 import heapq 最小ヒープ はじめに、リストをキューに優先度付きキューに変換します。 que = [3, 1, 5, 2] heapq.heapify(que) 先頭に最小値がきます。(先頭以外はソートされているわけではありません…

pyproject.toml利用時にアプリのバージョンを取得する

Pythonパッケージを作成する際、__init__.pyにバージョンを書いておき、setup.pyでは__init__.pyからimportすることが一般的かと思います。しかし、pyproject.toml を利用するとPythonファイルではないので setup.py のようにバージョンをimportすることはで…

Pythonでエスケープされた文字列を戻す

argparser の引数として文字列を入力すると自動的にエスケープされますが、改行などプログラム中で使いたい場合があるかと思います。そこで、エスケープされた文字列を元に戻す方法を紹介します。 はじめに、自動的にエスケープされることを確認します。 # m…

Clickでコマンド別にファイル分割する

PythonのCLIフレームワークの1つにclickがあります。 デコレータを使って簡単にCLIが作成できますが、1ファイルにすべてのコマンドのコードを書いていくと長くなります。 そこで、CommandCollectionを使って複数のコマンドをマージすることで、コマンド別に…

hackingとisortの競合を解決する

isortのデフォルトの設定では、例えば以下のようにソートされます。 import json import time from pathlib import Path from urllib.parse import urljoin, urlparse しかし、hackingを導入していると以下のようにエラーが発生します。 ./main.py:3:1: H306…

ArgumentParserをテストする

argparse を使うと簡単にCLIが作成できます。 そのままテストすることが少し難しかったので、調べた結果、parseするとことを別の関数に切り出して、その部分をテストするのが良さそうです。 # main.py def main(): args = parse_args(sys.argv[1:]) def pars…

ptpythonのColorSchemeを変更する

ptpythonのカラースキーマを変更する方法を紹介します。 はじめに、ptpythonのconfigファイルをダウンロードします。 mkdir ~/.ptpython wget https://raw.githubusercontent.com/prompt-toolkit/ptpython/master/examples/ptpython_config/config.py -P ~/.…

Pythonの再帰呼び出しの上限を変更する

Pythonの再帰呼び出しの上限は sys.getrecursionlimit() で確認できますが、デフォルトでは 1000 かと思います。 再帰呼び出しの多いアルゴリズムを使う場合には、エラーになるので、上限を変更することができます。 import sys sys.setrecursionlimit(10**6)

Pythonでn番目のフィボナッチ数を求める

フィボナッチ数列は 0, 1, 1, 2, 3, 5, 8, 13, ... と続く数列です。 このn番目の値をPythonで求めるには以下のようなにすれば良いです。 単純な方法 def fib(n): if n < 2: return n else: return fib(n - 2) + fib(n - 1) キャッシュを使う方法 標準モジュ…

pyenvでpythonのinstallエラーを解決する

pyenvでpythonをインストールしようとすると以下のようなエラーが発生しつまりましたので、その解決策を忘備録として残しておきます。 pyenv install 3.7.4 python-build: use openssl@1.1 from homebrew python-build: use readline from homebrew Download…

Pythonで多重ループを1行にまとめる

Pythonで多重ループを書くとき、標準ライブラリのitertools.productを使うと便利に書けます。 例えば、以下のような3重ループも # A, B, Cはリスト for i in A: for j in B: for k in C: print(i, j, k) このように、1行で書くことができます。 from itertoo…

pipenvのDistributionNotFoundを解決する

事象 久しぶりにpipenvを使用したら以下のようなエラーが発生しました。 Traceback (most recent call last): File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/bin/pipenv", line 6, in <module> from pkg_resources import load_entry_point File "/usr/local</module>…

Pythonのコーディングチェックにflake8を使う

flake8とは flake8は以下の3つのライブラリのラッパーです。 Pyflakes pycodestyle (pep8) *1 Ned Batchelder’s McCabe script インストール $ pip install flake8 使い方 $ flake8 main.py ファイルだけでなくフォルダを指定することもできます。 $ flake8 …

flake8で1行単位で警告を無視する

flake8で構文チェックしていると、一時的な書いているコードや特殊なライブラリなどで、1行単位で警告を無視したいとときがあるかと思います。 通常、 example = lambda: 'example' と書くと、以下のような警告が発生します。 E731 do not assign a lambda e…

PythonでOpenCVのビルド情報を取得する

python -c 'import cv2; print(cv2.getBuildInformation())' opencv-pythonでインストールできるOpenCVの場合 General configuration for OpenCV 3.4.4 ===================================== Version control: 3.4.4 Platform: Timestamp: 2018-11-27T15:2…

macOSでPythonをインストールしようとしたときのエラーを解決する

pyenvでpythonをインストールしようとすると以下のようなエラーが発生しました。 (原因かはわかりませんが、macOSのバージョンを10.13に上げてから発生しました。) $ pyenv install 3.6.4 python-build: use openssl from homebrew python-build: use read…