Pythonで関数の呼び出し元のファイル名と行番号を表示させる方法

今回はPythonでエディタを使わずに関数の呼び出し元のファイル名と行番号を表示させる方法についてご紹介いたします。



Pythonで関数の呼び出し元のファイル名と行番号を表示させる方法

Pythonである関数の呼び出し元のファイル名と行番号を表示させたいときってありますよね。

プロジェクトとPython専用のエディタがリンクしているときはエディタの機能として関数の呼び出し元を特定する機能が備わっている場合がありますが、プロジェクトによってはエディタがリンクできず、ロガーを差し込むことでしか呼び出し元が特定できなかったりデバックができなかったりする場合があります。

そんなときに役立つのがinspectのモジュールです。

例として、次の「main.py」と「sub1.py」の二つのPythonファイルがあるとします。

中身は簡単な処理で、main.pyで用意した文字列にsub1.pyで文字列をくっつけて出力しているだけです。
プログラムの実行結果は以下のようになります。

さて、ここでinspectモジュールを使って関数の呼び出し元を特定してみます。
例としてここではsub1.pyのsub1funcがどこから呼び出されているか特定したい場合を想定してみます。(プログラムを見れば容易に分かると思いますが、sub1.pyのsub1funcが呼び出されているファイルはmain.pyです)

inspectモジュールをインポートしてsub1funcの中身に
inspect.currentframe().f_back.f_code.co_filename

inspect.currentframe().f_back.f_lineno
を差し込んでみます。

inspect.currentframe().f_back.f_code.co_filename
は呼び出し元のファイル名を出力する機能で、
inspect.currentframe().f_back.f_lineno
は呼び出し元のファイルの行数を出力する機能です。
詳しくは公式ドキュメントをご覧ください。
inspect — 活動中のオブジェクトの情報を取得する

inspectモジュールを組み込んだ全体のサンプルプログラムは以下になります。

実際にこのプログラムを実行してみましょう。
printで文字列を出力した結果は以下のようになります。

呼び出し元のファイル名とパス、呼び出し元の行数が出力されていることが見てとれますね。

エディタを使わずに関数の呼び出し元を特定したい場合はinspectモジュールを使うことを検討してみましょう。

終わりに

今回はPythonでエディタを使わずに関数の呼び出し元のファイル名と行番号を表示させる方法についてご紹介いたしました。

最後までお読みいただきありがとうございます。
よろしければブログやTwitterでのシェアをお願いいたします。
コメントもお待ちしております。
誤植や勘違いなどございましたらコメント欄にて教えていただけると幸いです。






Python

Posted by ちこ