메인 프로그램 소개

Beginner

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

소개

이 섹션에서는 메인 프로그램 또는 메인 모듈의 개념을 소개합니다.

메인 함수 (Main Functions)

많은 프로그래밍 언어에는 main 함수 또는 메서드라는 개념이 있습니다.

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

이것은 애플리케이션이 시작될 때 실행되는 첫 번째 함수입니다.

Python 메인 모듈 (Main Module)

Python 에는 main 함수 또는 메서드가 없습니다. 대신, main 모듈이 있습니다. main 모듈은 가장 먼저 실행되는 소스 파일입니다.

$ python3 prog.py
...

시작 시 인터프리터에 제공하는 파일이 무엇이든 main이 됩니다. 이름은 중요하지 않습니다.

__main__ 확인 (check)

메인 스크립트로 실행되는 모듈은 다음 관례를 사용하는 것이 일반적입니다.

## prog.py
...
if __name__ == '__main__':
    ## Running as the main program ...
    statements
    ...

if 문 안에 포함된 문장이 main 프로그램이 됩니다.

메인 프로그램 (Main programs) vs. 라이브러리 임포트 (library imports)

모든 Python 파일은 메인으로 실행되거나 라이브러리 임포트로 사용될 수 있습니다.

$ python3 prog.py ## Running as main
import prog   ## Running as library import

두 경우 모두, __name__은 모듈의 이름입니다. 그러나 메인으로 실행되는 경우에만 __main__으로 설정됩니다.

일반적으로, 메인 프로그램의 일부인 문장이 라이브러리 임포트 시 실행되는 것을 원하지 않습니다. 따라서, 두 가지 방식으로 사용될 수 있는 코드에 if 검사를 사용하는 것이 일반적입니다.

if __name__ == '__main__':
    ## Does not execute if loaded with import ...

프로그램 템플릿 (Program Template)

다음은 Python 프로그램을 작성하기 위한 일반적인 프로그램 템플릿입니다.

## prog.py
## Import statements (libraries)
import modules

## Functions
def spam():
    ...

def blah():
    ...

## Main function
def main():
    ...

if __name__ == '__main__':
    main()

명령줄 도구 (Command Line Tools)

Python 은 종종 명령줄 도구에 사용됩니다.

$ python3 report.py portfolio.csv prices.csv

이는 스크립트가 셸/터미널에서 실행됨을 의미합니다. 일반적인 사용 사례는 자동화, 백그라운드 작업 등입니다.

명령줄 인수 (Command Line Args)

명령줄은 텍스트 문자열의 목록입니다.

$ 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]
...

표준 I/O (Standard I/O)

표준 입력/출력 (Standard Input / Output, 또는 stdio) 은 일반 파일과 동일하게 작동하는 파일입니다.

sys.stdout
sys.stderr
sys.stdin

기본적으로 printsys.stdout으로 향합니다. 입력은 sys.stdin에서 읽습니다. Traceback 및 오류는 sys.stderr으로 향합니다.

stdio는 터미널, 파일, 파이프 등에 연결될 수 있다는 점에 유의하십시오.

$ python3 prog.py > results.txt
## or
$ cmd1 | python3 prog.py | cmd2

환경 변수 (Environment Variables)

환경 변수는 셸에서 설정됩니다.

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

os.environ은 이러한 값을 포함하는 딕셔너리입니다.

import os

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

변경 사항은 프로그램에서 나중에 실행되는 모든 하위 프로세스에 반영됩니다.

프로그램 종료 (Program Exit)

프로그램 종료는 예외 (exceptions) 를 통해 처리됩니다.

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

다른 방법:

import sys
sys.exit(exitcode)

0 이 아닌 종료 코드 (exit code) 는 오류를 나타냅니다.

#! 라인 (line)

Unix 시스템에서 #! 라인은 스크립트를 Python 으로 실행할 수 있게 합니다. 스크립트 파일의 첫 번째 줄에 다음을 추가하십시오.

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

실행 권한이 필요합니다.

$ chmod +x prog.py
## 그런 다음 실행할 수 있습니다.
$ ./prog.py
... output ...

참고: Windows 의 Python Launcher 도 언어 버전을 나타내기 위해 #! 라인을 찾습니다.

스크립트 템플릿 (Script Template)

마지막으로, 명령줄 스크립트로 실행되는 Python 프로그램에 대한 일반적인 코드 템플릿은 다음과 같습니다.

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

## Import statements (라이브러리)
import modules

## Functions
def spam():
    ...

def blah():
    ...

## Main function
def main(argv):
    ## Parse command line args, environment, etc.
    ...

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 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.