No.4ベストアンサー
- 回答日時:
> でもなんでspamのなかみそういう例にしたんですか?
元ネタはこれ。
Learn to Program:
https://pine.fm/LearnToProgram/chap_06.html
言語はRubyだけどね。
No.3
- 回答日時:
例えば次のようなプログラムを書くとする。
実装例1:
https://www.ideone.com/uhkrXk
関数を定義して、実行部があるプログラムだ。
こいつを、例えばspam.pyと名付けるとする。
んで、例えば端末で引数を付けて呼び出すとそのまま実行してくれる。
➜ ~ python3 spam.py ゆゆにゃ。
おー、輝かしい未来が見えるぞよ。
➜ ~ python3 spam.py cametan_42
汝の未来は・・・おっと待った、いま何時だ!
私は行かねばならない。失敬する!
まぁ、この通りだよな。プログラムで書いた「実行部」が実行されるわけ。
ところが、こいつを他のPythonプログラムから呼び出すとやっぱり「実行される」わけ。
例えば次のようなプログラムがあるとする。
実装例2:
https://www.ideone.com/96u0ww
最初に書いたspam.pyをimportだけしてる。こいつをspamspam.pyとでも名付けてspam.pyと同じフォルダに突っ込んでおけば、spamspam.pyを起動させただけで
➜ ~ python3 spamspam.py ゆゆにゃ。
おー、輝かしい未来が見えるぞよ。
➜ ~ python3 spamspam.py cametan_42
汝の未来は・・・おっと待った、いま何時だ!
私は行かねばならない。失敬する!
となる・・・嬉しいか?
これ、実は通常は望んだ結果じゃない。「モジュールをimportしただけでモジュールに含まれてる実行部が実行される」ってのは嬉しくないよね。「黙ってろ」とか思うだろう。
「あるモジュールをimport」したい場合って大抵は書いてる関数とかクラスに用があるんであって、「実行部分」は必要ないんだよ。
つまり、単体で端末でスクリプトとして使う場合は実行部は必要なんだけど、モジュールとしてimportしたい場合は実行部は実行されて欲しくない。
そういう、実行部分を「都合が良い処理」として書くためにif __name__ == "__main__"がある。上のspam.pyならこう記述した方がいい。
実装例3:
https://www.ideone.com/2KLDvD
こうすれば端末上でスクリプトとして呼び出せば実行部分は実行されるけど、別のプログラムが関数fooを使いたくてspam.pyをimportした場合は実行部分が実行されない。
➜ ~ python3 spam.py ゆゆにゃ。
おー、輝かしい未来が見えるぞよ。
➜ ~ python3 spam.py cametan_42
汝の未来は・・・おっと待った、いま何時だ!
私は行かねばならない。失敬する!
実行結果自体は変わんないけどね。
なお、プログラムを書いて、いちいち端末上でpythonとかpython3とかインタプリタ名をコマンドとして書くのも嬉しくないんで、通常はif __name__ == "__main__"はシェバングと組み合わせる。具体的には次のように書く。
実装例4:
https://www.ideone.com/l32mLK
シェバングで使用する言語環境を指定出来る・・・ってこれは本当はUNIX流儀なんだけど、最近のWindows版Pythonもこれが使えるようになった・・・Windowsじゃちと意味不明なんだけど、お陰さんでWindows <-> UNIXでのPythonプログラムの「変更」が一つ減ったわけ。
いずれにせよシェバングを使えば端末上で「書いたプログラム(ファイル)名」だけ与えればスクリプトが実行されるようになる。
➜ ~ ./spam.py ゆゆにゃ。
おー、輝かしい未来が見えるぞよ。
➜ ~ ./spam.py cametan_42
汝の未来は・・・おっと待った、いま何時だ!
私は行かねばならない。失敬する!
端末での「コマンド名」が書いた「プログラム名(ファイル名)」だけ、になるんで、これで立派なCLIのプログラムになりました、めでたしめでたし、と言うわけ。
わかりましたか?

この回答へのお礼
お礼日時:2023/12/31 10:29
にゃるほど!なんかわかりました(๑•̀ㅂ•́)و✧
すごい丁寧にかいてくれて、ありがとうございます。
でもなんでspamのなかみそういう例にしたんですか?笑 占い??
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
英数字を含む文字列(0-9,A-Z)...
-
(再質問)エクセルのマクロボ...
-
Ruby require ライブラリー
-
ruby OpenURI::Meta
-
パソコンのスクリーンセーバー...
-
C言語の入力した文字を反転させ...
-
EXCEL 和暦入力
-
pandasでsqlite3にテーブル作成...
-
VBScriptでExcel(2019)上のデー...
-
よくTwitterで見かける #プログ...
-
WSLのUbuntuで、Railsのインス...
-
ruby while式
-
ruby loopメソッド 変数(再喝)
-
ruby 配列
-
ruby loopメソッド 変数
-
ruby クラス・オブジェクト・イ...
-
ルビー言語 ライブラリー 追記
-
ruby raise句
-
ruby begin句
-
ruby ensure句
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ruby require ライブラリー
-
ruby loopメソッド 変数(再喝)
-
(再質問)エクセルのマクロボ...
-
ruby OpenURI::Meta
-
ruby while式
-
ruby loopメソッド 変数
-
1、Rstudioで回帰直線を求める...
-
パソコンのスクリーンセーバー...
-
ビーリアルのユーザー名を変え...
-
ruby 配列
-
C言語の入力した文字を反転させ...
-
ruby クラス・オブジェクト・イ...
-
ルビー言語 ライブラリー 追記
-
100万件越えCSVから条件を満た...
-
ルビー言語 csvファイル 続き
-
Ruby newメソッド
-
教えてください
-
ruby raise句
-
英数字を含む文字列(0-9,A-Z)...
-
pythonエラー
おすすめ情報