web-dev-qa-db-ja.com

bash引数をpythonスクリプトに渡します

pythonスクリプトに独自の引数を渡すbashスクリプトを作成しようとしています。このように動作させたいです。

これを次のように実行すると:

script.sh latest

次に、bashスクリプト内でpythonスクリプトを次のような「最新の」引数で実行します。

python script.py latest

同様に、bashスクリプトが引数123で実行されている場合、pythonスクリプトは次のようになります。

python script.py 123

これを達成する方法を理解するのを手伝ってくれる人はいますか?

14
Jimmy

この場合の秘訣は、引数がない場合を含め、引数はいくつでも渡すことと、元のコマンドラインに存在していたグループ化を保持することです。

したがって、次の3つのケースを機能させる必要があります。

script.sh                       # no args
script.sh how now               # some number
script.sh "how now" "brown cow" # args that need to stay quoted

シェルはマクロ言語であるため、これを行うための自然な方法は実際にはありません。DTRTだけの魔法の構文が追加されています。

#!/bin/sh

python script.py "$@"
30
DigitalRoss

Pythonscript _script.py_でgetopt.getopt(args, options[, long_options])を使用して引数を取得します。

例:

_import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError as err:
        # print help information and exit:
        print str(err) # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        Elif o in ("-h", "--help"):
            usage()
            sys.exit()
        Elif o in ("-o", "--output"):
            output = a
        else:
            assert False, "unhandled option"
    # ...

if __name__ == "__main__":
    main()
_
6
wewa

非常に優れた組み込みパーサーはargparseです。次のように使用できます。

  import argparse

  parser = argparse.ArgumentParser(description='Process some integers.')
  parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
  parser.add_argument('--sum', dest='accumulate', action='store_const',
                     const=sum, default=max,
                   help='sum the integers (default: find the max)')

  args = parser.parse_args()
  print(args.accumulate(args.integers))

Bashでは、スクリプトに渡された引数は$#表記(#は数値です。$#をそのまま使用すると、渡される引数の数がわかります)。したがって、引数を渡したい場合:

スクリプトを呼び出す:

`#script.sh argument`

スクリプト内:

python script.py "$1"
1
Grambot