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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python

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

Q&A

解決済

3回答

2257閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

1クリップ

投稿2017/07/03 01:45

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

でリストで情報を保持している点もわからなくて、どうしてリスト型で受け取ったものをコマンドで使えるのでしょうか?(リストではなく文字列なら理解できます。コマンドで何か打つとき、リスト型ではなく文字列で打つので)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

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"になります。
第二引数は、コマンドラインを空白文字で単語に分解した物で、

C

1arv[0] = "python"; 2arv[1] = "argv01.py"; 3arv[2] = "text.txt"; 4arv[3] = NULL; // 終わりの印

のように設定されます。どのようなロジックで単語分解するかはシェルの機能に依ります。
第三引数は今回関係ないので説明を割愛します。

この渡されたargvをどのようにプログラムで受け取るかは言語に依ります。
Cだと、int ac, char **avと個数と文字列配列のペアで受け取るし、Pythonではsys.argvという配列で受け取ります。

投稿2017/07/03 02:41

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

うーんと、単純に下のような関数だと思ってもらって構わないのですが、何が分からないのかあっているのかはちょっと確信が持てませんね。

単に関数の引数と同じです。何故このように書けるかについてはそういう仕様ですとしか言えません。
python test.py test1.txt test2.txt
これは

python

1def argv(self,a,b): 2 return [self,a,b] 3#self,a,bは上記の例ではそれぞれ test.py,test1,txt,test2.txt

投稿2017/07/03 02:14

_Victorique__

総合スコア1392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sys.argvはコマンドライン引数を格納したリストを参照するものです
コマンドライン引数とはターミナルからプログラムを実行する際に通常スペース区切りで与えられる文字列の組です。

pythonの場合はpythonコマンドの後のスペース以後の文字列がコマンドライン引数となります。

$ python argv01.py text.txt

rrrrrrrrさんの例の場合"argv01.py","text.txt"がコマンドライン引数となります。リストの中には要素として文字列が格納されているわけですね。
プログラムの実行時に何らかのパラメータ(開きたいファイル名や動作モードなど)を与えたい時に使用されます。

コマンドライン引数はpython以外のプログラミング言語でも一般的に実装されていることの多い機能です。例えばC言語ではmain関数の引数として

C

1 int main(int argc, char *argv[])

のような形でコマンドライン引数を受け取ることが出来ます。

投稿2017/07/03 02:07

編集2017/07/03 02:09
remonn

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問