概要
Pythonでモジュールやスクリプトを書く場合のTips
moduleについて
module
再利用性の高いPythonスクリプトファイルを外部モジュールとして扱うことで、別のスクリプトから使うことができる。
module定義例
ex_mod.py
def ex_hello():
print("hello")
使用するモジュールはimport文でインポートする
import ex_mod
ex_mod.
__name__
による動作の区別
if __name__ == "__main__":
のような記述は何を意味しているか?
pythonプログラムから外部モジュールとして呼ばれたか、記述されたファイル自身が実行スクリプトとして呼ばれたかの違いを区別している。
実行スクリプトとして呼ばれた場合は自動変数__name__
に__main__
が、モジュールとして呼ばれた場合はモジュール名が設定される。
記述例
pythonモジュールの例
# module.py
def mod():
print(f"name = {__name__}")
if __name__ == "__main__":
mod()
単独のスクリプトとして実行すると
実行
$ ./module.py
出力
name = __main__
以下のような外部のmain()
からモジュールとして呼び出す場合
# main.py
import module
def main():
module.mod()
if __name__ == "__main__":
main()
main.pyを実行
実行
$ ./main.py
出力
name = module
importで参照するpath
importで参照する際のpathはsys
モジュールのsys.path
に格納されている
import sys
import pprint as pp
pp.pprint(sys.path)
プリント結果
['/home/(current_path)',
'/usr/lib/python38.zip',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/home/g4p/work/pyt/venv/lib/python3.8/site-packages']
コマンドライン引数
argparseモジュールを使用して処理するのが便利。
まずはargparseをimportする
# test_script.py
#!/bin/env python
import argparse
ArgumentParser()メソッドでparserインスタンスを作る。
parser = argparse.ArgumentParser(
prog="test script",
usage="./test_script.py [param] (options)",
description="Description",
add_help=True,
)
引数を追加する
-
add_arguments()
メソッドで引数を追加する。
オプション引数: optional arguments
- オプション引数は
'-n', '--name'
のように'-'
接頭辞付きで指定する
parser.add_argument("-o", "--output", help="output file name")
- 値を受け取らないで単に動作のフラグとして使用したい場合、action指定する。
parser.add_argument("-v", "--verbose", help="verbose", action="store_true")
位置引数: positional arguments
- 必ず値を取る必須な引数。
'-'
接頭辞なしで指定すると位置引数になる。 - 位置引数は指定が必須となる。
parser.add_argument("number")
値を参照する
parse_args()メソッドで値を参照することができる。
args = parser.parse_args()
print(f"args = {args}")
print(f"number = {args.number}")
print(f"verbose = {args.verbose}")
実行
$ ./test_script.py -v 2 -o out.txt
出力
args = Namespace(number='2', output='out.txt', verbose=True)
number = 2
output = out.txt
verbose = True
default値の指定
- default値の指定は
add_argument()
でdefault='xxx'
と記載する。
parser.add_argument("-t", "--type", help="foramt type of output", default='txt')
・・・
print(f"type = {args.type}")
実行
$ ./test_script.py -v 2 -o out.txt
出力
args = Namespace(number='2', output='out.txt', type='txt', verbose=True)
number = 2
output = out.txt
verbose = True
type = txt
標準ライブラリのモジュール
pprint による出力の整形
リストなど見やすく出力できる
import sys
print(sys.path)
通常のprint()
での出力結果
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/g4p/work/pyt/venv/lib/python3.8/site-packages']
pprint
モジュールのpprint()
を使う
import sys
import pprint
pprint.pprint(sys.path)
pprint.pprint()
での出力結果は適宜整形をしてくれる
['',
'/usr/lib/python38.zip',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/home/g4p/work/pyt/venv/lib/python3.8/site-packages']
プリント出力でなく文字列として取得したい場合
pprint.pformat()
を使う
str = pprint.pformat(sys.path)
print(str)
['',
'/usr/lib/python310.zip',
'/usr/lib/python3.10',
'/usr/lib/python3.10/lib-dynload',
'/usr/local/lib/python3.10/dist-packages',
'/usr/lib/python3/dist-packages']
参考