1. ホーム
  2. python

[解決済み] sys.argv[1]のスクリプトでの意味

2022-03-04 09:41:04

質問

私は現在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()

解決方法は?

これまでの回答は、ユーザーの知識について多くの前提を置いていたことに留意したいと思います。この回答は、よりチュートリアルなレベルで質問に答えることを試みています。

Pythonを起動するたびに sys.argv は自動的にコマンドラインの引数(スペースで区切られたもの)を表す文字列のリストとなります。この名前は C言語プログラミング規約 で、argvとargcはコマンドラインの引数を表します。

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のコードでは、この文字列のリストをプログラムへの入力として使用することができます。リストは0ベースの整数でインデックスされるので、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] はコマンドラインの第1引数を表します。 string ) が当該スクリプトに供給される。入力のプロンプトは表示されませんが、スクリプト名に続くコマンドライン上に引数がない場合は、IndexErrorで失敗します。