sys
のドキュメントを確認しましたが、まだ不明な点があります。私はstackoverflowでいくつかの同様の質問を探しましたが、有用なものは何も見つかりませんでした(明らかにどんな参照もありがたいです!)。
スクリプトを作成したい-たとえばfoo.py
-3から6個の引数を渡したい:
$ python foo.py arg1 arg2 arg3
いずれの場合も、最初の3つの引数を指定する必要があります。最後の3つの引数は、何も渡されない場合にデフォルトの引数値を持つ関数で使用されます。
問題は、これをどのように行うかです。これまで私は次のようなものを書くことを考えていましたfoo.py
(これは、私の質問を裏付ける具体的なものを用意することのみを目的とした簡単な例です):
import sys
def example(credit_mom, credit_dad, debt_mom, debt_dad = 1000,
salary = 2000, bonus = 0):
total_gain = salary + credit_dad + credit_mom + bonus
total_loss = debt_dad + debt_mom
return total_gain - total_loss
if __name__ == '__main__':
if len(sys.argv) < 4:
sys.exit('Need at least 3 arguments. The order is as follows:\n\
1.credit_mom;\n\
2.credit_dad;\n\
3.debt_mom;\n\
4.others')
else:
sys.exit(example(sys.argv[1],
sys.argv[2],
sys.argv[3],
sys.argv[4],
sys.argv[5],
sys.argv[6]))
このスクリプトを実行すると、明らかにIndexError
例外が発生します。
$ python foo.py 110 110 220
Traceback (most recent call last):
File "foo.py", line 19, in <module>
sys.argv[4],
IndexError: list index out of range
argparse (および チュートリアルはこちら )を使用することをお勧めします。パラメータの存在を手動で確認する必要がなくなります。さらに、argparseは--help
引数を景品として提供し、提供されている場合は、各引数に定義されたhelp=""
文字列を読み取ります。
あなたの場合、3つの必須(位置)引数と3つのオプション引数があります。サンプルのargparseコードは次のようになります。
#!/usr/bin/python
# coding: utf-8
import argparse
def parseArguments():
# Create argument parser
parser = argparse.ArgumentParser()
# Positional mandatory arguments
parser.add_argument("creditMom", help="Credit mom.", type=float)
parser.add_argument("creditDad", help="Credit dad.", type=float)
parser.add_argument("debtMom", help="Debt mom.", type=float)
# Optional arguments
parser.add_argument("-dD", "--debtDad", help="Debt dad.", type=float, default=1000.)
parser.add_argument("-s", "--salary", help="Debt dad.", type=float, default=2000.)
parser.add_argument("-b", "--bonus", help="Debt dad.", type=float, default=0.)
# Print version
parser.add_argument("--version", action="version", version='%(prog)s - Version 1.0')
# Parse arguments
args = parser.parse_args()
return args
def example(credit_mom, credit_dad, debt_mom, debt_dad = 1000, salary = 2000, bonus = 0):
total_gain = salary + credit_dad + credit_mom + bonus
total_loss = debt_dad + debt_mom
return total_gain - total_loss
if __name__ == '__main__':
# Parse the arguments
args = parseArguments()
# Raw print arguments
print("You are running the script with arguments: ")
for a in args.__dict__:
print(str(a) + ": " + str(args.__dict__[a]))
# Run function
print(example(args.creditMom, args.creditDad, args.debtMom, args.debtDad, args.salary, args.bonus))
私はargparse
アプローチを支持していますが、これが迅速で汚いアプローチです。
arg1, arg2, arg3 = [None, False, []]
if sys.argv[1:]: # test if there are atleast 1 argument (beyond [0])
arg1 = sys.argv[1]
if sys.argv[2:]:
arg2 = sys.argv[2] # careful 'True' is a string, not a boolean
arg3 = sys.argv[3:] # rest
ほとんどの場合、スクリプトに引数解析を追加し始めたときにこれを使用しますが、引数の選択は成熟していません。これは、「オプション」よりも「位置」に適しています(argparseの用語を使用するため)。
argparse
(私がお勧めします)を使用する以外に、これはスライスして展開することで解決できます。
sys.exit(example(*sys.argv[1:7]))
スライスには、要求されたスライスのサイズを満たすのに十分でない場合でも、実際に存在する要素のみが含まれます。
あなたの関数「例」は問題ありません。問題は、そこにないsysargsを読み取ろうとしていることです。それらが空であるかどうかを確認してみてください(else節で)。