スクリプトでのsys.argv [1]の意味


146

私は現在Pythonを教えており、(以下の私の例を参照して)単純化された用語で何がsys.argv[1]表すのか疑問に思っていました。それは単に入力を求めているのですか?

#!/usr/bin/python3.1

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
  print ('Hello there', sys.argv[1])
  # Command line args are in sys.argv[1], sys.argv[2] ..
  # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
  main()

2
これは、問題の一部ではない、それは非常に古いですが、モジュールargparseは、おそらくによると、より良いあなたがやろうとしている何のためにある、この
LLRの

回答:


334

以前の回答では、ユーザーの知識について多くの仮定が行われていたことに注意したいと思います。この回答は、よりチュートリアルレベルで質問に回答しようとします。

Pythonを呼び出すたびsys.argvに、コマンドラインで引数を(スペースで区切って)表す文字列のリストが自動的に表示されます。この名前は、argvとargcがコマンドライン引数を表すCプログラミング規則に由来しています。

Pythonに慣れてきたら、リストと文字列についてもっと学びたいと思うでしょうが、それまでの間、いくつか知っておくべきことがここにあります。

引数が表されているとおりに引数を出力するスクリプトを作成するだけです。lenリストの関数を使用して、引数の数も出力します。

from __future__ import print_function
import sys
print(sys.argv, len(sys.argv))

スクリプトにはPython 2.6以降が必要です。このスクリプトprint_args.pyを呼び出す場合は、さまざまな引数を指定してスクリプトを呼び出し、何が起こるかを確認できます。

> python print_args.py
['print_args.py'] 1

> python print_args.py foo and bar
['print_args.py', 'foo', 'and', 'bar'] 4

> python print_args.py "foo and bar"
['print_args.py', 'foo and bar'] 2

> python print_args.py "foo and bar" and baz
['print_args.py', 'foo and bar', 'and', 'baz'] 4

ご覧のとおり、コマンドライン引数にはスクリプト名が含まれていますが、インタープリター名は含まれていません。この意味で、Pythonはスクリプト実行可能ファイルとして扱います。実行可能ファイル(この場合はPython)の名前を知る必要がある場合は、を使用できますsys.executable

例からわかるように、ユーザーが引用符でカプセル化された引数を使用してスクリプトを呼び出した場合、スペースを含む引数を受け取ることができるため、ユーザーが指定した引数のリストが得られます。

これで、Pythonコードで、この文字列のリストをプログラムへの入力として使用できます。リストにはゼロベースの整数でインデックスが付けられているため、list [0]構文を使用して個々のアイテムを取得できます。たとえば、スクリプト名を取得するには:

script_name = sys.argv[0] # this will always work.

おもしろいですが、スクリプト名を知っている必要はほとんどありません。ファイル名のスクリプトの後に最初の引数を取得するには、次のようにします。

filename = sys.argv[1]

これは非常に一般的な使用法ですが、引数が指定されていない場合はIndexErrorで失敗することに注意してください。

また、Pythonではリストのスライスを参照できるため、ユーザーが指定した引数のみの別のリストを取得するには(ただし、スクリプト名はなし)、次のようにします。

user_args = sys.argv[1:] # get everything after the script name

さらに、Pythonでは、一連の項目(リストを含む)を変数名に割り当てることができます。したがって、ユーザーが常に2つの引数を提供することを期待する場合は、それらの引数を(文字列として)2つの変数に割り当てることができます。

user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2

したがって、特定の質問に答えるために、は、問題のスクリプトに提供さsys.argv[1]れた最初のコマンドライン引数を(としてstring)表します。入力のプロンプトは表示されませんが、スクリプト名に続くコマンドラインで引数が指定されていない場合、IndexErrorで失敗します。


1
文字列のリストを表示すると、sys.argvその行from __future__ import print_functionは何をしているのでしょうか。それは私がいた場合、私は追加する必要がありますものですしないで Pythonの3が、Pythonの2で実行していますか?@Jason R. Coombs
ニコラス

1
@ NicholasLiu、Python 3を使用している場合は追加する必要はありません。完全を期すために追加しました。Python 2でそれなしで実行してみると、私が説明したものとは異なる結果が得られます。試してみる。
Jason R. Coombs 2016

@ JasonR.Coombs私はこれと混同しています:sys.argv **is** automatically a list of strings。「与える」または「返す」という意味ですか?
JinSnow 2017

1
@ギラウム:微妙な意味の違いですが、Pythonでは、sys.argvなどの名前はオブジェクトへの参照を保持します。したがって、技術的にargvは、sysモジュールの属性は、引数の文字列を含むリストオブジェクトへの参照です。関数の呼び出し、ジェネレータ、または別の構成要素を使用するgivesreturns、提案する。referencesまたはrepresentsより正確な用語かもしれませんが、is十分に近いです。
Jason R. Coombs 2017

@ JasonR.Coombs mainモジュールをインポートして直接呼び出し(モジュール名はとしましょうmoduleA.py)して、のように関数を呼び出すとどうなりますかimport moduleA; moduleA.main()。その場合、コマンドライン引数はありません。つまりsys.argv[0]filenameIE を表すことになっています。印刷する必要がありますmoduleA.pyか?
alpha_989 2018

34

sys.argv [1]には、スクリプトに渡される最初のコマンドライン 引数が含まれています。

たとえば、スクリプトに名前を付けてhello.py、次のコマンドを発行したとします。

$ python3.1 hello.py foo

または:

$ chmod +x hello.py  # make script executable
$ ./hello.py foo

スクリプトが印刷されます:

こんにちはfoo

私はこのコマンドを実行する必要があります:exec py C:\\ project-open \\ servers \\ projop \\ packages \\ intranet-timesheet2 \\ www \\ hours \\ y.pyの相対パスを使用する方法はありますかPythonファイル?
yaksh

25

sys.argv リストです。

このリストはコマンドラインによって作成されます。これはコマンドライン引数のリストです。

例えば:

コマンドラインで次のように入力します

python3.2 file.py something

sys.argv リストになります['file.py'、 'something']

この場合 sys.argv[1] = 'something'


12

たとえば、次のようにスクリプトを呼び出すと、フレデリックの答えに追加されます。

./myscript.py foo bar

sys.argv[0]「./myscript.py」 sys.argv[1]は「foo」、 sys.argv[2]「bar」になります...など。

コード例 ./myscript.py foo では、次のようにスクリプトを呼び出すと、スクリプトの出力は「Hello there foo」になります。


9

Jasonの回答にいくつかのポイントを追加します。

ユーザー提供のすべての引数を取る場合: user_args = sys.argv[1:]

sys.argvを(Jasonが言及した)文字列のリストと見なします。したがって、すべてのリスト操作がここで適用されます。これは「リストのスライス」と呼ばれます。詳細については、こちらをご覧ください

構文は次のとおりです:list [start:end:step]。startを省略した場合はデフォルトで0になり、endを省略した場合はデフォルトでリストの長さになります。

3番目の引数の後のすべての引数のみを受け取りたいとすると、次のようになります。

user_args = sys.argv[3:]

最初の2つの引数だけが必要で、次に:

user_args = sys.argv[0:2]  or  user_args = sys.argv[:2]

引数2〜4が必要だとします。

user_args = sys.argv[2:4]

最後の引数が必要だとします(最後の引数は常に-1なので、ここで何が起こっているのかというと、カウントを後ろから開始します。つまり、開始は最後、終わりなし、ステップなしです)。

user_args = sys.argv[-1]

最後の2番目の引数が必要だとします。

user_args = sys.argv[-2]

最後の2つの引数が必要だとします。

user_args = sys.argv[-2:]

最後の2つの引数が必要だとします。ここで、startは-2です。これは、2番目の最後の項目であり、最後に( ":"で示されます)です。

user_args = sys.argv[-2:]

最後の2つの引数以外のすべてが必要だとします。ここで、startは0(デフォルト)で、endは最後から2番目の項目です。

user_args = sys.argv[:-2]

引数を逆順にしたいとします:

user_args = sys.argv[::-1]

お役に立てれば。


4

sys.argvは、スクリプトパスとコマンドライン引数を含むリストです。つまり、sys.argv [0]は実行しているスクリプトのパスであり、後続のすべてのメンバーは引数です。


3

コマンドラインを介してスクリプトを実行しているときにPythonスクリプトに引数を渡すには

python create_thumbnail.py test1.jpg test2.jpg

ここでは、スクリプト名-create_thumbnail.py、引数1-test1.jpg、引数2-test2.jpg

create_thumbnail.pyスクリプトで使用します

sys.argv[1:]

コマンドラインで['test1.jpg'、 'test2.jpg']として渡した引数のリストが表示されます


1

sys.argvsysモジュールの属性です。コマンドラインでファイルに渡される引数を示しています。sys.argv[0]ファイルが置かれているディレクトリをキャッチします。sys.argv[1]コマンドラインで渡された最初の引数を返します。example.pyファイルがあると考えてください。

example.py

import sys # Importing the main sys module to catch the arguments
print(sys.argv[1]) # Printing the first argument

これを実行すると、コマンドプロンプトに次のように表示されます。

python example.py

2行目でインデックスエラーがスローされます。原因は、まだ引数が渡されていないためです。ユーザーがを使用して渡した引数の長さを確認できますif len(sys.argv) >= 1: # Code。引数を渡してexample.pyを実行すると

python example.py args

それは印刷します:

args

それが最初の議論だったので!PyInstallerを使用して実行可能ファイルにしたとしましょう。これを行います:

example argumentpassed

それは印刷します:

argumentpassed

ターミナルでコマンドを作成するときに非常に役立ちます。まず、引数の長さを確認します。引数が渡されない場合は、ヘルプテキストを実行してください。


0

sys .argvは、スクリプトの実行時に渡されたコマンドライン引数を表示します。または、sys.argvは、ターミナルからの実行中にpythonで渡されたコマンドライン引数を保存します。

ちょうどこれを試してください:

import sys
print sys.argv

argvは、Pythonリストで渡されたすべての引数を格納します。上記は、スクリプトを実行するために渡されるすべての引数を出力します。

次に、filename.pyを次のように実行してみます。

python filename.py example example1

これにより、3つの引数がリストに出力されます。

sys.argv[0] #is the first argument passed, which is basically the filename. 

同様に、argv 1は最初に渡される引数です。この場合は 'example'です。

同様の質問がすでにここで行われています。お役に立てれば!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.