python执行程序时生成的pyc文件里面是,PyCodeObject 的结构体构成,每个命名空间(函数名、import模块等)都会形成一个core block,一个python程序的所有命名空间生成core block记录到pyc里,就是Python的在执行时可以把pyc的内容调用到内存,进行执行。有时候是不产生pyc文件的,也就是执行时候内存的东西没有写到pyc文件,就没有pyc文件产生。
 
/* Bytecode object */
typedef struct {
    PyObject_HEAD
    int co_argcount;            /* #arguments, except *args */
    int co_nlocals;             /* #local variables */
    int co_stacksize;           /* #entries needed for evaluation stack */
    int co_flags;               /* CO_..., see below */
    PyObject *co_code;          /* instruction opcodes */
    PyObject *co_consts;        /* list (constants used) */
    PyObject *co_names;         /* list of strings (names used) */
    PyObject *co_varnames;      /* tuple of strings (local variable names) */
    PyObject *co_freevars;      /* tuple of strings (free variable names) */
    PyObject *co_cellvars;      /* tuple of strings (cell variable names) */
    /* The rest doesn't count for hash/cmp */
    PyObject *co_filename;      /* string (where it was loaded from) */
    PyObject *co_name;          /* string (name, for reference) */
    int co_firstlineno;         /* first source line number */
    PyObject *co_lnotab;        /* string (encoding addr<->lineno mapping) */
    void *co_zombieframe;     /* for optimization only (see frameobject.c) */
} PyCodeObject;
 
 
co_argcount :  Code Block的位置参数个数,比如说一个函数的位置参数个数
co_nlocals:       Code Block中局部变量的个数,包括其中位置参数的个数
co_stacksize:    执行该段Code Block需要的栈空间
co_flags:           N/A
co_code:          Code Block编译所得的字节码指令序列。以PyStingObjet的形式存在
co_consts:       PyTupleObject对象,保存CodeBlock中的所常量
co_names:       PyTupleObject对象,保存CodeBlock中的所有符号
co_varnames:    Code Block中的局部变量名集合
co_freevars:     Python实现闭包需要用的东西
co_cellvars:     Code Block中内部嵌套函数所引用的局部变量名集合
co_filename:   Code Block所对应的.py文件的完整路径
co_name:        Code Block的名字,通常是函数名或类名
co_firstlineno: Code Block在对应的.py文件中起始行
co_lnotab:        字节码指令与.py文件中source code行号的对应关系,以PyStringObject的形式存在
 
 
 
下面进行一个例子:
 
demo.py
class A:
    pass
 
def Fun():
    pass
 
a=A()
Fun()
 
 
F:\>python
Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> source=open('demo.py').read()
>>> co=compile(source,'demo.py','exec')
>>> type(co)
<class 'code'>
>>> dir(co)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_kwonlyargcount', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']
>>> print(co.co_names)
('demo', 'py', 'A', 'Fun', 'a')
>>> print(co.co_filename)
demo.py
>>>
 
 
 
 
 
 
 
 
 
 
 
.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

.pyc文件的结构体PyCodeObject的更多相关文章

  1. C语言文件读写(结构体文件)

    有时候,我们需要将输入的数据存储起来,这时候就需要用到文件,对于C语言而言,文件的读写有多种方式,下面主要是结构体文件的读写,例如student.dat(第一列是学号,第二列是姓名) xiaoming ...

  2. PE文件常用结构体

    Dos头结构: typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_c ...

  3. Golang Json文件解析为结构体工具-json2go

    代码地址如下:http://www.demodashi.com/demo/14946.html 概述 json2go是一个基于Golang开发的轻量json文件解析.转换命令行工具,目前支持转换输出到 ...

  4. Linux C Socket编程发送结构体、文件详解及实例

    利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.c ...

  5. PYC文件简介

    PYC文件简介¶ 不说废话,这里说的pyc文件就是 Python 程序编译后得到的字节码文件 (py->pyc). 基本格式¶ pyc文件一般由3个部分组成: 最开始4个字节是一个Maigc i ...

  6. 《python解释器源码剖析》第8章--python的字节码与pyc文件

    8.0 序 我们日常会写各种各样的python脚本,在运行的时候只需要输入python xxx.py程序就执行了.那么问题就来了,一个py文件是如何被python变成一系列的机器指令并执行的呢? 8. ...

  7. Python逆向(二)—— pyc文件结构分析

    一.前言 上一节我们知道了pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件是二进制的,可以由python虚拟机直接执行的程序.分析pyc文件的文件结构对于实现python编译与反 ...

  8. Linux 准确查找结构体定义位置

    例如:查找文件操作结构体 struct file_operations, 使用转移符 "\" $ grep struct\ file_operations\ { kernel/in ...

  9. cdev结构体

    在内核源码include/linux/cdev.h里对cdev结构体的定义: struct cdev { struct kobject kobj; // 内嵌的kobject对象  struct mo ...

随机推荐

  1. 从零开始学Docker

    在写这篇博客之前,听说过Docker技术,但是一直没有主动去深入了解.用这篇博客来记录自己学习Docker的个人总结,会一直补充完善. 我这边先随便写,后期再做总结!! Docker官网: https ...

  2. js异步加载和按需加载

    function loadScript(url,callback){ var script = document.creatElement("script"); script.ty ...

  3. mycat学习日记:全局sequence

    mycat分库分表的情况下,原生mysql的自增长主键无法满足主键全局唯一这个要求.看了MYCAT社区从零开始的一篇博客,加上自己的实践,大概总结一下. 目前mycat对于全局sequence主要提供 ...

  4. Spark Mllib里如何将如温度、湿度和风速等数值特征字段用除以***进行标准化(图文详解)

    不多说,直接上干货! 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的第18章 决策树回归分类Bike Sharing数据集

  5. 【异常】SQL Server blocked access to STATEMENT OpenRowset/OpenDatasource

    异常错误提示:SQL Server blocked access to STATEMENT OpenRowset/OpenDatasource of component  Ad Hoc Distrib ...

  6. springMVC框架的理解加深,个人的一些想法

    一 写spring-boot整合的时候,有种想看源码的冲动!呸,是钻牛角尖的毛病犯了... @RequestMapping("/index") public String inde ...

  7. Linux学习笔记——如何使用echo指令向文件写入内容

    0.前言     本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符.     echo向文件中输出内容 ...

  8. C# 加密、解密函数

    #region ========加密======== /// <summary> /// 加密 /// </summary> /// <param name=" ...

  9. java中循环的不同终止方式

    1.break:直接强行跳出当前循环,不再执行剩余代码.但在多重循环的情况下,若break在内层循环中,则仅仅终止了内层循环,外循环照常执行. 2.continue:仅仅终止此次循环. 3.retur ...

  10. ABAP常用事务码

    开发----------------------------------------------- SE51  屏幕制作 SE91  MESSAGE OBJECT SE80  对象浏览器(可以建开发类 ...