メインプログラムの紹介

PythonPythonBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このセクションでは、メインプログラムまたはメインモジュールの概念を紹介します。

メイン関数

多くのプログラミング言語には、「main」関数またはメソッドの概念があります。

// c / c++
int main(int argc, char *argv[]) {
   ...
}
// java
class myprog {
    public static void main(String args[]) {
       ...
    }
}

これは、アプリケーションが起動されたときに最初に実行される関数です。

Pythonのメインモジュール

Pythonには「main」関数またはメソッドはありません。代わりに、「main」モジュールがあります。「mainモジュール」は最初に実行されるソースファイルです。

$ python3 prog.py
...

起動時にインタプリタに与えるファイルは何でも「main」になります。名前は関係ありません。

__main__ のチェック

メインスクリプトとして実行されるモジュールでは、この規則を使用するのが標準的な慣習です。

## prog.py
...
if __name__ == '__main__':
    ## メインプログラムとして実行中...
    statements
  ...

if 文の中に囲まれた文が、「main」プログラムになります。

メインプログラムとライブラリのインポート

どのPythonファイルも、メインとして実行するか、ライブラリとしてインポートするかのどちらかになります。

$ python3 prog.py ## メインとして実行中
import prog   ## ライブラリとしてインポートして実行中

どちらの場合も、__name__ はモジュールの名前です。ただし、メインとして実行されている場合にのみ __main__ に設定されます。

通常、メインプログラムの一部である文がライブラリのインポート時に実行されることは望ましくありません。したがって、どちらの方法でも使用される可能性のあるコードには if チェックを行うことが一般的です。

if __name__ == '__main__':
    ## importで読み込まれた場合には実行されません...

プログラムのテンプレート

Pythonプログラムを書くための一般的なプログラムのテンプレートは次の通りです。

## prog.py
## インポート文(ライブラリ)
import modules

## 関数
def spam():
 ...

def blah():
 ...

## メイン関数
def main():
 ...

if __name__ == '__main__':
    main()

コマンドラインツール

Pythonはしばしばコマンドラインツールに使用されます。

$ python3 report.py portfolio.csv prices.csv

これは、スクリプトがシェル/ターミナルから実行されることを意味します。一般的な使い方は、自動化やバックグラウンドタスクなどです。

コマンドライン引数

コマンドラインは、文字列のリストです。

$ python3 report.py portfolio.csv prices.csv

この文字列のリストは、sys.argv の中にあります。

## 前のbashコマンドで
sys.argv ## ['report.py', 'portfolio.csv', 'prices.csv']

引数を処理する簡単な例を以下に示します。

import sys

if len(sys.argv)!= 3:
    raise SystemExit(f'Usage: {sys.argv[0]} ' 'portfile pricefile')
portfile = sys.argv[1]
pricefile = sys.argv[2]
...

標準入出力

標準入出力(またはstdio)は、通常のファイルと同じように機能するファイルです。

sys.stdout
sys.stderr
sys.stdin

デフォルトでは、printはsys.stdoutに出力されます。入力はsys.stdinから読み取られます。トレースバックとエラーはsys.stderrに出力されます。

stdioは、端末、ファイル、パイプなどに接続されている可能性があることに注意してください。

$ python3 prog.py > results.txt
## または
$ cmd1 | python3 prog.py | cmd2

環境変数

環境変数はシェルで設定されます。

$ export NAME=dave
$ export RSH=ssh
$ python3 prog.py

os.environ はこれらの値を含む辞書です。

import os

name = os.environ['NAME'] ## 'dave'

変更は、プログラムによって後で起動されるサブプロセスに反映されます。

プログラムの終了

プログラムの終了は例外を通じて処理されます。

raise SystemExit
raise SystemExit(exitcode)
raise SystemExit('Informative message')

代替案。

import sys
sys.exit(exitcode)

ゼロ以外の終了コードはエラーを示します。

#!

Unix では、#! 行を使ってスクリプトを Python として起動できます。スクリプトファイルの最初の行に次のように追加します。

#!/usr/bin/env python3
#./prog.py
...

実行可能なパーミッションが必要です。

$ chmod +x prog.py
## その後、実行できます
$./prog.py
... 出力...

注:Windows の Python ランチャーも、言語バージョンを示すために #! 行を探します。

スクリプトのテンプレート

最後に、コマンドラインスクリプトとして実行される Python プログラムの一般的なコードテンプレートを示します。

#!/usr/bin/env python3
#./prog.py

## インポート文(ライブラリ)
import modules

## 関数
def spam():
  ...

def blah():
  ...

## メイン関数
def main(argv):
    ## コマンドライン引数、環境などを解析する
  ...

if __name__ == '__main__':
    import sys
    main(sys.argv)

演習3.15:main()関数

report.py ファイルに、コマンドラインオプションのリストを受け取り、以前と同じ出力を生成する main() 関数を追加します。この関数を使って、次のように対話的に実行できるようにします。

>>> import report
>>> report.main(['/home/labex/project/report.py', '/home/labex/project/portfolio.csv', '/home/labex/project/prices.csv'])
      Name     Shares      Price     Change
---------- ---------- ---------- ----------
        AA        100       9.22     -22.98
       IBM         50     106.28      15.18
       CAT        150      35.46     -47.98
      MSFT        200      20.89     -30.34
        GE         95      13.48     -26.89
      MSFT         50      20.89     -44.21
       IBM        100     106.28      35.84
>>>

pcost.py ファイルを変更して、同様の main() 関数を持つようにします。

>>> import pcost
>>> pcost.main(['/home/labex/project/pcost.py', '/home/labex/project/portfolio.csv'])
Total cost: 44671.15
>>>
✨ 解答を確認して練習

演習3.16:スクリプトの作成

report.pypcost.py プログラムを変更して、コマンドラインでスクリプトとして実行できるようにします。

$./report.py portfolio.csv prices.csv
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84

$./pcost.py portfolio.csv
Total cost: 44671.15
✨ 解答を確認して練習

まとめ

おめでとうございます!あなたはメインモジュールの実験を完了しました。あなたの技術を向上させるために、LabExでさらに多くの実験を行って練習することができます。