Python関連のパッケージ(ツールやライブラリ)を管理します。ここで紹介する pip 以外のツールは、いずれも 「pip install ツール名」で簡単にインストールできるものです。Python 3系の場合は pip3 という名前の場合があります。
# pip install package_name // パッケージをインストールする # pip uninstall package_name // パッケージをアンインストールする # pip search package_name // リポジトリからパッケージを探す # pip list // インストール済みパッケージを表示する
Python プログラムを解析し、バグの原因となりそうな箇所をチェックします。
# pip install pylint // pylint をインストールする $ pylint ./src // ./src 配下のソースをチェックする
Python プログラムが PEP8 と呼ばれる Python のコーディングスタイルに従っているか、および簡単なエラーチェックを行います。pycodestyle というスタイルチェッカ、pyflakes というエラーチェッカ、mccabe という複雑度チェッカを内部で利用しています。
# pip install flake8 // flake8 をインストールする $ flake8 ./src // ./src 配下のソースをチェックする
Python プログラムを PEP8 と呼ばれる Python のコーディングスタイルに準拠するように自動フォーマットします。
# pip install black // black をインストールする $ black ./src // ./src 配下のソースをフォーマットする $ black --diff ./src // ファイルは書き換えずに修正案のみを表示する $ black -l 140 ./src // 1行の長さ上限を88文字から140文字に緩和する
Python に標準添付されるシングルラインデバッガです。まず、プログラムの中に下記の1行を埋め込みます。
import pdb; pdb.set_trace()
プログラムを実行すると上記コードを埋め込んだ箇所でデバッガに制御が移り、デバッガコマンドを使用できるようになります。
$ python sample.py -> ret = add(3, 5) (Pdb) s (Pdb) q
デバッガコマンドには下記などがあります。
h // ヘルプ表示 l // 周辺のソースコード表示 s // 1ステップ実行(関数の中に入る) n // 1ステップ実行(関数の中に入らない) c // 次のブレークポイントまで実行 r // 現在の関数が終わるまで実行 p exp // 変数expの値を表示 q // デバッガを終了
CUIを用いたビジュアルなデバッガツールです。
$ pip install pudb // pudb をインストールする
pdb と同様、プログラムの中に下記の1行を埋め込みます。
import pudb; pudb.set_trace()
プログラムを実行すると上記コードを埋め込んだ箇所でデバッガに制御が移り、グラフィカルにデバッガコマンドを使用できるようになります。使用できるコマンドは、ほぼ pdb と同様です。
シンプルなユニットテスト(単体テスト)ツールです。まず、テストプログラムを記述します。assert 文でテストの内容を記述します。
def test_case1(): ret = add(3, 5) assert ret == 8
下記の様に実行します。test_*.py にマッチするファイルの test で始まる関数、および、Test で始まるクラスの test で始まるメソッドが実行の対象となります。
$ pip install pytest // pytest をインストールする $ pytest ./tests // tests フォルダ配下の単体テストを実行する ============= FAILURES =============== def test_case1(): ret = add(3, 5) > assert ret == 8 E assert 10 == 8 ========== 1 failed in 0.08s =========
pytest と同様のユニットテストツールです。まず、テストプログラムを書きます。test で始まるファイル名、unittest.TestCase を継承するクラス、test で始まるメソッド名にしてください。
import unittest from lib.mysample import myfunc class TestCase1(unittest.TestCase): def test_case_1_1(self): ret = myfunc(3, 5) self.assertEqual(ret, 8) if __name__ == "__main__": unittest.main()
下記の様に実行します。
$ python ./tests/test_case1.py
カレントディレクトリ配下のファイルを探索して実行することもできます。各ディレクトリには __init__.py が必要です。
$ python -m unittest discover -v test_case_1_1 (tests.test_case1.TestCase1) ... ok ---------------------------------------------------------------------- Ran 1 tests in 0.001s OK
unittest のテスト網羅度を集計します。
$ pip install coverage // coverage をインストールする $ coverage run --append ./tests/test_case1.py // テスト1を実行する $ coverage run --append ./tests/test_case2.py // テスト2を実行する $ coverage report -m // テスト結果(.coverage)をレポートする Name Stmts Miss Cover Missing --------------------------------------------------- lib/calc.py 10 1 90% 11 tests/test_case1.py 11 0 100% tests/test_case2.py 11 0 100% --------------------------------------------------- TOTAL 32 1 97% $ coverage html // HTMLレポート(.htmlcov)を生成する $ coverage erase // テスト結果(.coverage)を削除する
Python 専用ツールではありませんが、様々な言語のプログラム行数をカウントします。files, blank, comment, code はそれぞれファイル数、空白行数、コメント行数、プログラム行数を示します。
# yum install -y cloc // cloc をインストールする $ cloc ./src // ./src 配下のプログラム行数を調べる ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- Python 1 0 0 11 JavaScript 1 3 2 8 ------------------------------------------------------------------------------- $ cloc --by-file ./src // ファイル毎に行数を表示する $ cloc --diff ./src1 ./src2 // ./src1 から ./src2 への修正行数を調べる
CSS を拡張した、SCSS 形式の Sass ファイルを CSS 形式にコンパイルします。
$default-font-size: 9pt; body { font-size: $default-font-size; }
# yum install -y gcc python36u-devel pcre-devel # pip3 install pyscss // pyscss をインストールする $ pyscss style.scss -o style.css // SCSS を CSS にコンパイルする $ pyscss -w ./css // ./css フォルダを監視して更新時に自動コンパイルする
ソースコードを解析し、セキュリティ的な問題を含む可能性のあるコードを洗い出します。下記の例では「パスワードがハードコーディングされている」といった、セキュリティ上の問題点をレポートしています。
# pip3 install bandit // bandit をインストールする $ bandit -r . // カレントディレクトリ配下をチェックする >> Issue: [B105:hardcoded_password_string] Possible hardcoded password: 'AgBx8#4G98F' Severity: Low Confidence: Medium Location: ./sample.py:5 More Info: https://bandit.readthedocs.io/en/latest/plugins/b105_hardcoded_password_string.html 4 5 password = 'AgBx8#4G98F'