[解決済み] sys.argv[1]のスクリプトでの意味
質問
私は現在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で失敗します。
関連
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] オブジェクト名の前のシングルアンダーコアとダブルアンダーコアの意味は何ですか?
-
[解決済み] Pythonスクリプトのプロファイリングはどのように行うのですか?
-
[解決済み] スクリプトを実行しているPythonのバージョンを確認するにはどうしたらいいですか?
-
[解決済み] スクリプトを終了させるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
任意波形を生成してtxtで保存するためのPython実装
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み] sys.argv[1], IndexError: list index out of range [duplicate].
-
[解決済み] スライス表記を理解する
-
[解決済み] コマンドライン引数の読み方・処理方法は?