はじめに
Pythonでのimportと関数、main関数についてのかなり基礎的な内容です。
ほかの言語と混ぜて使っているとうっかり忘れていてエラーの原因になっていたりするので忘備録として残しておきます。
動作確認環境は次の通りです。
- OS:Windows
- Python:ver3.8.2
importは1度だけファイルを実行する
importは対象のpythonファイルを実行します。
例えば「helloworld」を出力する次のようなpythonファイルを「helloworld.py」として作成します。
print('helloworld')
「helloworld.py」を実行するともちろん出力は次のようになります。
>>python helloworld.py helloworld
importは呼び出したpythonスクリプトを実行する
ここで、次のように「helloworld.py」をimportするpythonファイルを「sample.py」として作成します。
import helloworld
「sample.py」を実行すると出力は次のようになります。
>>python sample.py helloworld
もちろんこんな書き方をする人はいないとは思いますが、importによって呼び出したpythonファイルが実行されていることは理解できました。
importは同じpythonファイルは1度しか実行しない
では「sample.py」を次のように書き換えるとどうなるでしょうか。
import helloworld import helloworld
importでは同じpythonファイルは1度のみ実行されるので当然ですが、結果は先ほどと変わらず次のようになります。
>>python sample.py helloworld
importと関数
上述のようにimportでは同じpythonファイルは1度しか実行してくれません。
関数を使うことで、毎回呼び出す形にはなりますが複数回同じ動作を実行可能にできます。
まずは「helloworld.py」を次のように関数とその関数を呼び出すようなスクリプトに書き換えます。
def hello(): print('helloworld') hello()
ここでhelloworld.pyを実行すると最初の時と同じように出力されます。
>>python helloworld.py helloworld
関数のあるpythonファイルをimportする
ここで次のような「sample.py」を実行するとどうなるでしょう。
import helloworld
もちろん「helloworld.py」を実行したときと同じで、次のような出力になります。
>>python sample.py helloworld
ここで「hello()」は関数なのでimportした先で呼び出すことができます。
つまり次のように「sample.py」を書き換えることができます。
import helloworld helloworld.hello()
実行結果は次のようになります。
>>python sample.py helloworld helloworld
importした時とhello関数を呼び出した時とで2回「helloworld」が表示されます。
importと__name__
ようやくここで__name__という存在が役に立つ時が来ました。
「helloworld.py」を次のように書き直します。
def hello(): print('helloworld') if __name__ == '__main__': hello()
これを実行すると次のようになります。
>>python helloworld.py helloworld
次のように書き換えた「sample.py」を実行します。
import helloworld helloworld.hello()
結果は次のようになります。
>>python sample.py helloworld
これは「__name__」が次のような性質を持つため、if文で条件分岐が可能だからです。
- 「python 〇〇〇.py」のように実行された場合には「__main__」という文字列が格納される。
- 「import 〇〇〇」のようにimportされて場合には「〇〇〇」という文字列が格納される。
つまり、最初の「python helloworld.py」の場合にのみif文の中身が実行されるため、importした際には実行されず、どちらも関数を1度だけ実行した結果が出力されているのです。
最後に
ほとんどの人にとっては当たり前のことかもしれませんが、割と真剣になんだっけと忘れやすいのがpythonスクリプトをすべて実行するというところですね。
ちなみに「from-import」でも一度はすべて実行されるのでぜひ確認してみてください。
コメント