0

使用sys.argvする場合、使用する理由があるか、*argまたは使用sys.argvできるすべてのことを実行でき*argますか?

例えば:

>>>def test(*arg):
>>>    return arg
>>>
>>>print test('hello','salut','hola')
>>>('hello','salut','hola')

コマンドラインから呼び出すsys.argvファイル内で使用すると、次のようになります。trial.py

import sys
def test(argument):
    return argument

print test(sys.argv[1])


python trial.py 'hello','salut','hola'
hello,salut,hola

または、argv実際には引数を 1 つだけ受け取るように調整されており、argv が 2 つ以上持つことは可能items(argv[0],argv[1])ですか?

4

2 に答える 2

4

sys.argvは、スクリプトに提供される可能性のあるコマンド ライン引数を含む文字列のリストです。

最初の要素はスクリプト自体の名前になり、残りのエントリは、コマンドがコマンド ラインから呼び出されたときに指定された項目に対応します。最後の質問に答えるにargvは、2 つ以上のアイテムを含めることができます。

たとえば、スクリプトに名前を付けtestme.pyて開始した場合

testme.py this is a test

それから

sys.argv[0] would contain "test.me"
sys.argv[1] would contain "this"
sys.argv[2] would contain "is"
sys.argv[3] would contain "a"
sys.argv[4] would contain "test"

シェルは、どのエントリが割り当てられるかを決定しますsys.argv-あなたの場合、それは部分を分離する空白のない1つの連続した文字列であったため、1つの引数と見なされました(したがって、連結されたように見えました)。

于 2012-08-17T02:45:40.387 に答える
3

sys.argvコマンドラインで Python スクリプトが呼び出されたすべての引数を含むリストであり、スクリプト自体は「引数 0」と見なされます。

これは、たまたまリストを含む他の変数と同じ、通常の変数です。したがって、 と の間sys.argvに「選択」はありません*arg*arg複数の引数として呼び出しに渡すリスト (またはその他のシーケンス) をアンパックするために使用される構文です。sys.argvリストを含む他の変数と同様に、を渡すときにこの構文を使用できます。*または、 を省略して、リスト全体を 1 つの引数として渡すこともできます。繰り返しますが、リストがたまたまそうであったかどうかは、sys.argv何が起こったかとは無関係です。

あなたの混乱の原因は、Pythonスクリプトを呼び出しているシェルが、Pythonと同じように複数の引数が分離されているとは見なしていないことだと思います。Python では、複数の引数をコンマで区切るため、'hello','salut','hola'3 つの引数になります (ただし、コンマの後にスペースを入れるのがより一般的なスタイルです)。

ほとんどのシェルOTOHでは、引数は空白で区切られています。'hello','salut','hola'には空白が含まれていないため、1 つの引数にすぎません。そのため、Python リストにsys.argv1 つの項目として表示されます。複数の引数を 1 つに連結する魔法は何も起こりません。議論が1つしかなかったというだけです。Python レベルsys.argvで 3 つの項目を取得する方法は、次のようにスクリプトを呼び出すことです。

python trial.py 'hello' 'salut' 'hola'

また、Python の場合と同様に、シェル コマンド ラインで引用符を使用しているようにも見えます。ほとんどのシェルでは、すべてが文字列であるため、常に文字列を引用符で囲む必要はありません。代わりに、引用符は、空白を含む文字列が実際には複数の引数ではなく空白を含む 1 つの引数であることをシェルに伝えるため、またはシェルがデフォルトでどこでも行う特定の特別な処理を無効にするために使用されます。

Python では'hello'、文字列を「hello」にする必要があるため、Python はそれを変数として読み取ろうとしませんhello。しかし、シェルでは、'hello'helloはどちらも同じで、単に文字列「hello」を意味します。he'll'oただし、文字列の一部のみを引用して記述することもできます。これは、シェルが引用符内の空白やその他の特殊文字を処理する方法を変更するだけですが、結果は同じ文字列「hello」になります。'hello','salut','hola'これが、シェルがフォームを文字列 "hello,salut,hola" として解釈する理由です。引用符の外側に空白がないため、3 つの単語は個別の引数として扱われず、シェルに特殊文字の処理方法を指示するジョブを実行した後、引用符は消えます。

于 2012-08-17T03:16:10.407 に答える