web-dev-qa-db-ja.com

python整数として解釈されないPythonコマンドで引数として渡された数値

私はCに精通しており、Pythonで実験を始めました。私の質問はsys.argvコマンド。私はそれがコマンドラインインタープリターに使用されていることを読みましたが、単純なプログラムを実行しようとすると、期待した結果が得られません。

コード:

import sys

a = sys.argv[1]
b = sys.argv[2]

print a, b

print a+b

入力:

python mySum.py 100 200

出力:

100 200
100200

2つの引数を追加すると、2つの値が加算される代わりに連結されます。値は文字列として取られているようです。

それらを数値として解釈するにはどうすればよいですか?

23
Kalyan

Int()を使用して引数を整数に変換できます

import sys

a = int(sys.argv[1])  b = int(sys.argv[2])

print a, b

print a+b

入力:python mySum.py 100 200

出力:

100 200
300
32
Wesley

ユーザー入力も検証する必要があります。

import sys

def is_intstring(s):
    try:
        int(s)
        return True
    except ValueError:
        return False

for arg in sys.argv[1:]:
    if not is_intstring(arg):
        sys.exit("All arguments must be integers. Exit.")

numbers = [int(arg) for arg in sys.argv[1:]]
sum = sum(numbers)

print "The sum of arguments is %s" % sum
12

実際、あなたは自分で問題を発見しました。_sys.argv_は文字列の配列です。

int()を使用して、文字列を整数に変換できます。この場合の例:a = int(sys.argv[1])

11
Peter Smit

_sys.argv_アイテムは常にstringsです。 int(a)intにキャストする必要があります。

OptParse などのCLI引数を処理するためにサードパーティのライブラリを使用することもできます。

4
Andy Terra

Pythonでは、文字列は暗黙的に整数に変換されません。試してみる

num1 = int(sys.argv[1])
This would represent the numerical value of the number, not its string representation.
0
OmniBean

コマンドライン引数を含む比較の実行に注意してください。これは、reallyPython 2's policy for異なるタイプのオブジェクトを比較する( 'int' <'list' <'string' <'Tuple') here 。In Python 3、異なるオブジェクトを比較するタイプはTypeErrorにつながります。

オブジェクト比較の混乱の例については、セクション6.1.1のint()呼び出しを削除してみてください。 Pythonチュートリアルフィボナッチコード の場合、whileループ条件が「int」<「string」になるため、無限ループになります。 (これはPerlでは発生しません、btw)。

Python 3。

0
Trutane