>백엔드 개발 >파이썬 튜토리얼 >Python 프로그램의 실행 원리

Python 프로그램의 실행 원리

巴扎黑
巴扎黑원래의
2016-12-08 10:34:241849검색

1. 프로세스 개요

Python은 먼저 코드(.py 파일)를 바이트코드로 컴파일하여 바이트코드 가상머신에 전달합니다. 그런 다음 가상머신은 바이트코드 명령어를 하나씩 실행하여 프로그램을 완성합니다. 실행.

2. 바이트코드

바이트코드는 Python 가상 머신 프로그램의 PyCodeObject 객체에 해당합니다.

.pyc 파일은 디스크의 바이트코드를 표현한 파일입니다.

3.pyc 파일

PyCodeObject 객체는 모듈이 로드될 때, 즉 가져오기할 때 생성됩니다.

Python test.py는 test.py를 바이트코드로 컴파일하고 해석하여 실행하지만 test.pyc를 생성하지는 않습니다.

test.py가 import util과 같은 다른 모듈을 로드하면 Python은 util.py를 바이트코드로 컴파일하고 util.pyc를 생성한 다음 바이트코드를 해석하고 실행합니다.

test.pyc를 생성하려면 Python 내장 모듈 py_compile/compileall을 사용하여 컴파일하면 됩니다.

모듈을 로드할 때 .py와 .pyc가 모두 존재하면 Python은 .pyc를 사용하려고 시도합니다. .pyc의 컴파일 시간이 .py의 수정 시간보다 빠르면 .py가 다시 컴파일됩니다. .pyc가 업데이트됩니다.

4. PyCodeObject

 Python 코드의 컴파일된 결과는 PyCodeObject 객체입니다.

typedef struct {

PyObject_HEAD

int co_argcount; /* 위치 매개변수 수*/

int co_nlocals;

int co_stacksize; /* 스택 크기*/

int co_flags;

PyObject *co_code; /* 바이트코드 명령 시퀀스*/

PyObject *co_consts ; /* 모든 상수 집합*/

 PyObject *co_names; /* 모든 기호 이름 집합*/

 PyObject *co_varnames; /* 지역 변수 이름 집합*/

 PyObject *co_freevars; /* 클로저에 사용되는 변수 이름 세트*/

 PyObject *co_cellvars; /* 내부 중첩 함수가 참조하는 변수 이름 세트*/

 / * 나머지는 hash/cmp에 포함되지 않습니다. */

PyObject *co_filename; /* 코드가 있는 파일 이름*/

PyObject *co_name; name|클래스 이름* /

 int co_firstlineno; /* 파일에 있는 코드 블록의 시작 줄 번호*/

 PyObject *co_lnotab; /* 바이트코드 명령어와 줄 간의 대응 관계 숫자*/

 void *co_zombieframe; /* 최적화 전용(frameobject.c 참조) */

 } PyCodeObject;


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.