PythonでWindowsアプリケーションを作ったとする。
たとえばファイルを引数に取り、整形するものだとする。
せっかくWindowsアプリケーション、というかGUI上のプログラムなんだから、アプリケーションにドラッグ&ドロップしたいじゃないか。
どうしたらできるか。
…まあ普通にargvで受け取ればいいんですがね。
以下、Pythonにおけるargvの使い方メモ。

sys.argv

sys.argvは、コマンドラインで渡される引数が入ったリスト。
sys.argv[0]にはスクリプト自身が入る。
len(sys.argv)で引数の数をカウントできる。
できるが、スクリプト自身も含めての数であることに注意。sys.argv[0]に自分が入っているからね。

サンプルスクリプト

サンプルスクリプトである。

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

この実行結果は、たとえば以下のようになる。

$ 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などで中身を一つ一つ参照できるが、自分自身からまず始まるのは美しくない。

引数一つ目から扱うには

以下のようにする。

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()に渡すというわけ。
出力は例えば以下のようになる。

$ 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

ベリーナイス。

シャレオツな使い方(引数の数を担保したい)

さて。もうちょっと頭のいいことをやってみたい。
具体的には、引数を一つだけ取るようにしたい。
さてサンプル。

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:])

出力例

$ 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>

シャレオツな使い方(引数の内容を担保したい)

さらに。
ファイルを引数に取るとして(さあ冒頭の話につながってまいりました!)、そのファイルの有無を確認したい。
サンプル。

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:])

出力例

$ 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!

以上でござる