質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.37%

  • Python

    12882questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

sys.argvでユーザーIDなど細かいコマンドを渡せる理由

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 837
退会済みユーザー

退会済みユーザー

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

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で質問しよう!

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    12882questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。