sys.argvでユーザーIDなど細かいコマンドを渡せる理由
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 1,481

退会済みユーザー
sys.argvでユーザーIDなど細かいコマンドを渡せる理由がわかりません。
# coding: Shift_JIS
import sys
# モジュール属性 argv を取得するため
argvs = sys.argv # コマンドライン引数を格納したリストの取得
argc = len(argvs) # 引数の個数
# デバッグプリント
print argvs
print argc
print
if (argc != 2): # 引数が足りない場合は、その旨を表示
print 'Usage: # python %s filename' % argvs[0]
quit() # プログラムの終了
print 'The content of %s ...n' % argvs[1]
f = open(argvs[1])
line = f.readline() # 1行読み込む(改行文字も含まれる)
while line:
print line
line = f.readline()
f.close
とコードを書くと、
$ python argv01.py text.txt
のようにpythonファイルだけでなく、fileopenしたいファイル(ここではtext.txt
)もコマンドに渡せ実行できることがわかります。
しかし、どうしてこの一行で
argvs = sys.argv
上記のようなpythonファイルだけでなく、fileopenしたいファイル(ここではtext.txt)もコマンドに渡せ実行できるようになるのかがわかりません。sysメソッドが標準入力を受け取れるものであることはわかりますが、それがターミナルとどのように関連しているのかがわかりません。また
argvs = sys.argv
でリストで情報を保持している点もわからなくて、どうしてリスト型で受け取ったものをコマンドで使えるのでしょうか?(リストではなく文字列なら理解できます。コマンドで何か打つとき、リスト型ではなく文字列で打つので)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
シェルのコマンドラインで、python argv01.py text.txt
と打つと、シェルがその文字列を分解して、Pythonを呼び出します。
このとき、あるプログラム(ここではシェル)が他のプログラム(ここではPython)を呼び出すには、Unix/Linuxだと、execve()
というシステムコールを使います。
execve()
の引数は、execve(const char *filename, char *const argv[], char *const envp[])
です。
第一引数は呼び出すプログラムで、シェルが環境変数PATH
からpython
を探して例えば/usr/bin
にあれば、第一引数は"/usr/bin/python"
になります。
第二引数は、コマンドラインを空白文字で単語に分解した物で、
arv[0] = "python";
arv[1] = "argv01.py";
arv[2] = "text.txt";
arv[3] = NULL; // 終わりの印
のように設定されます。どのようなロジックで単語分解するかはシェルの機能に依ります。
第三引数は今回関係ないので説明を割愛します。
この渡されたargvをどのようにプログラムで受け取るかは言語に依ります。
Cだと、int ac, char **av
と個数と文字列配列のペアで受け取るし、Pythonではsys.argv
という配列で受け取ります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
sys.argvはコマンドライン引数を格納したリストを参照するものです
コマンドライン引数とはターミナルからプログラムを実行する際に通常スペース区切りで与えられる文字列の組です。
pythonの場合はpythonコマンドの後のスペース以後の文字列がコマンドライン引数となります。
$ python argv01.py text.txt
rrrrrrrrさんの例の場合"argv01.py","text.txt"がコマンドライン引数となります。リストの中には要素として文字列が格納されているわけですね。
プログラムの実行時に何らかのパラメータ(開きたいファイル名や動作モードなど)を与えたい時に使用されます。
コマンドライン引数はpython以外のプログラミング言語でも一般的に実装されていることの多い機能です。例えばC言語ではmain関数の引数として
int main(int argc, char *argv[])
のような形でコマンドライン引数を受け取ることが出来ます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
うーんと、単純に下のような関数だと思ってもらって構わないのですが、何が分からないのかあっているのかはちょっと確信が持てませんね。
単に関数の引数と同じです。何故このように書けるかについてはそういう仕様ですとしか言えません。
python test.py test1.txt test2.txt
これは
def argv(self,a,b):
return [self,a,b]
#self,a,bは上記の例ではそれぞれ test.py,test1,txt,test2.txt
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる