PythonでWindowsアプリケーションを作ったとする。
たとえばファイルを引数に取り、整形するものだとする。
せっかくWindowsアプリケーション、というかGUI上のプログラムなんだから、アプリケーションにドラッグ&ドロップしたいじゃないか。
どうしたらできるか。
…まあ普通にargvで受け取ればいいんですがね。
以下、Pythonにおけるargvの使い方メモ。
sys.argv
sys.argvは、コマンドラインで渡される引数が入ったリスト。
sys.argv[0]にはスクリプト自身が入る。
len(sys.argv)で引数の数をカウントできる。
できるが、スクリプト自身も含めての数であることに注意。sys.argv[0]に自分が入っているからね。
サンプルスクリプト
サンプルスクリプトである。
1 2 3 4 5 6 7 |
import sys print "the name of script is :", sys.argv[0] print "the number of arg is :", len(sys.argv) for arg in sys.argv: print arg |
この実行結果は、たとえば以下のようになる。
1 2 3 4 5 6 7 |
$ python ./argv.py a b c the name of script is : ./argv.py the number of arg is : 4 ./argv.py a b c |
sys.argvはリストなのでforなどで中身を一つ一つ参照できるが、自分自身からまず始まるのは美しくない。
引数一つ目から扱うには
以下のようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import sys def main(argv): print "the name of script is :", sys.argv[0] print "the number of original arg is :", len(sys.argv) print "the number of altered arg is :", len(argv) for arg in argv: print arg if __name__ == "__main__": main(sys.argv[1:]) |
端的に言えば、一枚レイヤを入れる。
一番下のif文部分でsys.argvを受けたら、リストの一つ目以降、つまりスクリプト自身を除いた残りをmain()に渡すというわけ。
出力は例えば以下のようになる。
1 2 3 4 5 6 7 |
$ python ./argv.py a b c the name of script is : ./argv.py the number of original arg is : 4 the number of altered arg is : 3 a b c |
ベリーナイス。
シャレオツな使い方(引数の数を担保したい)
さて。もうちょっと頭のいいことをやってみたい。
具体的には、引数を一つだけ取るようにしたい。
さてサンプル。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def main(argv): print "the name of script is :", sys.argv[0] print "the number of original arg is :", len(sys.argv) print "the number of altered arg is :", len(argv) if len(argv) != 1: sys.exit("Usage: %s <filename>" % sys.argv[0]) print argv[0] if __name__ == "__main__": main(sys.argv[1:]) |
出力例
1 2 3 4 5 |
$ python ./argv.py a b c the name of script is : ./argv.py the number of original arg is : 4 the number of altered arg is : 3 Usage: ./argv.py <filename> |
シャレオツな使い方(引数の内容を担保したい)
さらに。
ファイルを引数に取るとして(さあ冒頭の話につながってまいりました!)、そのファイルの有無を確認したい。
サンプル。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import sys import os def main(argv): print "the name of script is :", sys.argv[0] print "the number of original arg is :", len(sys.argv) print "the number of altered arg is :", len(argv) if len(argv) != 1: sys.exit("Usage: %s <filename>" % sys.argv[0]) if not os.path.exists(argv[0]): sys.exit('ERROR: file %s was not found!' % argv[0]) print argv[0] if __name__ == "__main__": main(sys.argv[1:]) |
出力例
1 2 3 4 5 |
$ python ./argv.py a the name of script is : ./argv.py the original number of arg is : 2 the altered number of arg is : 1 ERROR: file a was not found! |
以上でござる