python执行py文件的流程

当我们执行一个py文件的时候,直接python xx.py即可,那么这个流程是怎么样的呢。先说明一下,python执行代码实际上是先打开文件然后执行里面的代码,所以文件的扩展名不一定是py的形式,txt形式也是依旧可以成功执行,只要文件里面的代码是符合python规范的。下面我们来看看python是怎么执行py文件的。

先将文件里面的内容读取出来,scanner对其进行扫描,切分成一个个的token

parser对token进行解析,建立抽象语法树(AST,abstract syntax tree)

compiler对ast进行编译,得到python字节码

code evaluator执行字节码

我们注意到第三个过程,是一个编译的过程。说明python即便是解释性语言,也依旧存在着编译的过程,这一点和java是一样的。之所以要存在编译的过程,主要是为了优化执行的速度,比如元组,或者函数里面出现了yield,这一点在编译的时候就已经确定了,编译的时候就已经知道这是一个什么样的数据结构,那么在执行的时候可以很快速的分配相应的内存。我们在打开python文件所在的目录的时候,总会看到一个__pycache__的文件夹,这里面存放的就是python编译之后的字节码。当执行python文件的时候,会检测当前的__pycache__目录中是否有对应的字节码,没有就创建,有的话比较字节码的创建时间和当前py文件的修改时间,如果字节码的创建时间要晚一些,说明用户没有修改文件,于是执行字节码,如果字节码的创建时间要早一些,说明用户修改了python源代码,那么就会从新编译得到一个新的字节码。此外编译还有一个重要的特点,就是语法检测。错误分为两种:一种是语法错误,另一种是逻辑错误。

语法错误就是源代码没有遵循python的规范,比如if判断使用了一个=,或者for循环后面没有:等等,这些都是属于语法错误,这是一种低级的错误,在编译的时候就会失败。

try:

>

except Exception:

pass

"""

这个代码是编译不过去的,即便你使用了try···except。

语法错误就是不遵循python规范,编译的时候都编译不过。

"""

那么另一种错误就是逻辑错误,这是语法没问题,但是执行的时候出错了,比如索引越界、和0相除、变量没有定义等等,这些错误是在运行的时候才会出现的,这是可以被捕获的。

try:

a

except Exception:

pass

# 这段代码是不会报错的。

python如何编译py文件生成字节码

python中的字节码有两种,pyc和pyo,两者本质上没啥区别,只不过pyo的优化程度更高一些。

编译可以通过py_compile模块进行编译

# test.py

def foo(name):

print("hello " + name)

我们来对test.py进行编译

import py_compile

"""

参数如下:

file:要编译的py文件

cfile:编译之后的字节码文件,不指定的话默认为源文件目录下的__pycache__目录的下的'源文件名.解释器类型-python版本.字节码类型'文件

dfile:错误消息文件,默认和cfile一样,一般不用管

doraise:是否开启异常处理,默认和False

optimize:优化字节码级别。如果是pyc:可以选-1或0。pyo的话,可以选1或2。都是值越小优化程度越高

"""

py_compile.compile(file="test.py", cfile=r"./test.pyc", optimize=-1)

py_compile.compile(file="test.py", cfile=r"./test.pyo", optimize=1)

可以看到,已经编译成功了,pyc是可以直接当做普通py文件导入的,但是pyo貌似不可以,所以一般我们只编译成pyc形式的字节码。但是如果不导入只是执行的话,那么是可以编译成pyo的。

import test

test.foo("mashiro") # hello mashiro

编译的另一种方式,我们也可以直接使用命令行。

编译成pyc

python -m py_compile 源代码

编译成pyo

python -O -m py_compile 源代码

如果需要编译整个目录内的所有源代码

python compileall

python编译py文件生成.pyd(.so)

为什么会有pyd,因为更安全,如果不希望源代码被公开的话,可以变成扩展模块。字节码是可以被反编译的,但是pyd目前还没有被反编译的情况,而且在编译成pyd之后会更快。首先要安装Cython,直接pip install 即可

pyd相当于是Windows中的dll,不同的是pyd只能被python调用。

# test.py

def add(a: int, b: int) -> int:

return a + b

def haha(n: int) -> int:

return sum(range(n))

下面编译test.py生成pyd

# to_pyd.py

import Cython.Build

# 这个函数将会在对应py文件的目录下创建一个同名的.c文件,当然这个不重要

# 这个函数是有返回值的,会返回一个distutils.extension.Extension对象列表

ext = Cython.Build.cythonize("test.py")

# 下面还要导入另一个模块

import distutils.core

# 调用setup方法

distutils.core.setup(

name="mashiro.pyd", # 编译后的pyd文件名

version="1.0", # 报的版本号,这个无所谓,可以不用管

ext_modules=ext, # 这个很重要,就是我们使用Cython.Build.cythonize返回的结果

author="猪哥哥", # 无所谓,可以不管

author_email="shiinamashiro163@gmail.com" # 邮箱,可以不用管

)

然后最后一步,打开所在终端,执行编译

python to_pyd.py build

或者

python to_pyd.py build_ext

编译之后会得到一个build目录,里面就是编译之后的内容

在Windows上会得到pyd,但是在linux上会得到.so文件

这个文件和Windows的pyd一样,是可以当做普通模块直接导入的。

# 1.py

import test # 直接导入即可,后面那一大串不用管

print(test) #

print(test.__file__) # /home/wmz/build/lib.linux-x86_64-3.7/test.cpython-37m-x86_64-linux-gnu.so

print(test.add(100, 200)) # 300

print(test.haha(1000000)) # 499999500000

python中嵌入C语言

1.c

#include

#include

int add(int a, int b)

{

return a + b;

}

int sub(int a, int b)

{

return a - b;

}

编译这段c代码,生成.so文件,此时的.so文件不是由python代码生成的,而是由c代码生成,所以就不能通过import的方式直接导入了

编译:gcc -o 编译之后的dll或者so文件名 -shared c源文件

import ctypes

lib = ctypes.cdll.LoadLibrary("./heiheihei.so") # 加载共享库

# 直接调用相应的函数即可

print(lib.add(20, 10))

print(lib.sub(20, 10))

当然c中各种类型,在ctypes都有对应。比如结构体、指针等等,更复杂的用法可以参考官网。

python编译 pyd 工具_python如何编译py文件生成pyc、pyo、pyd以及如何和C语言结合使用...相关推荐

  1. python代码编译成pyd_python如何编译py文件生成pyc、pyo、pyd以及如何和C语言结合使用...

    python执行py文件的流程 当我们执行一个py文件的时候,直接python xx.py即可,那么这个流程是怎么样的呢.先说明一下,python执行代码实际上是先打开文件然后执行里面的代码,所以文件 ...

  2. python生成pyc_如何生成pyc/pyo/pyd文件

    # 一.如何生成pyc/pyo文件 # 1.通过编写代码生成 import py_compile # 参数如下 ''' def compile(file, cfile=None, dfile=None ...

  3. Python篇之编译py文件为pyc文件的方法总结

    一.前言 一般来说,当我们在发布系统的时候,希望上线的代码是安全可靠的,不希望别人能看到源代码,通常都会先提前编译好,然后进行发布,在python中,编译好的代码格式为 .pyc 文件 常见的pyth ...

  4. python编译py文件为pyc文件

    python py编译pyc方法和运行导入pyc 1.编译文件 编译py文件为pyc文件: import py_compile py_compile.compile('./test.py') 结果会在 ...

  5. python环境打包编译py文件成pyc和pyo

    pyc和pyo简介 .pyc 在执行python代码时经常会看到同目录下自动生成同名的pyc文件.这是python源码编译后的字节码,一般会在代码执行时自动生成你代码中引用的py文件的pyc文件.这个 ...

  6. Python的py文件生成pyd文件

    使用 py2exe 打包 Python 程序 Python的py文件生成pyd文件 源代码: git@gitee.com:menglingzhi/cython_test.git 另外python打包w ...

  7. 使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用

    文章目录: 1 准备环境 2 调用`Cython库包`把python的`.py`文件生成`.so`文件 2.1 写源码文件 2.2 调用源码接口 2.3 调用Cython库把`.py`源码生成`.so ...

  8. python运行pyc文件_Python什么情况下会生成pyc文件?

    作为Python爱好者,需要了解.py脚本的基本运行机制及特性: 在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运 ...

  9. python执行py文件生成pyc_python生成pyc文件

    pyc文件是py文件编译后生成的字节码文件(byte code).pyc文件经过python解释器最终会生成机器码运行.所以pyc文件是可以跨平台部署的,类似Java的.class文件.一般py文件改 ...

  10. python py文件与pyc文件相互转换

    本文以Python3.8为例 1. compileall py文件转换为pyc 1.1.compileall命令行模式 不需要额外安装,python自带模块. 可以利用Python -m的方式在命令行 ...

最新文章

  1. Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比
  2. python自动整理文件夹_计算机文件和文件夹的Python自动管理,自动化,电脑,及
  3. 当世界模型被用于sim2real:机器人通过视觉想象和交互尝试来学习
  4. OpenCASCADE绘制测试线束:几何命令之预测
  5. 注意职场“十不要”,让你少奋斗30年
  6. java csv 导出_java实现CSV文件输出
  7. C++语言基础 —— STL —— 容器与迭代器 —— heap
  8. 安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)
  9. springboot异常处理方式
  10. [ C语言 ] 用C语言实现小游戏 ---- 三子棋 代码 + 解析
  11. 爬虫项目十一:用Python爬下微博博主所有视频、所有微博数据、获取评论数据
  12. length()、size()、sizeof()三者的区别
  13. 服务器虚拟化双活,分布式双活数据中心部署模式
  14. APS54085 线性PWM调光降压 LED恒流驱动芯片
  15. ESP32 驱动WS2812B 灯条
  16. html5考试总结300字,期末考试总结反思300字
  17. Node+Express跨域问题解决
  18. Android 自定义scheme及多端唤起使用方法
  19. qq群引流靠谱吗?为什么选择QQ引流?QQ引流好吗?
  20. AC日记 - - - 30(为了相同的前缀-跳楼梯)

热门文章

  1. java楼宇报警器_智能楼宇包含哪些安防子系统
  2. RN listView使用
  3. ListView学习思维导图
  4. Luogu2564 [SCOI2009]生日礼物
  5. CF1047E Region Separation
  6. 数组模拟栈解决括号匹配
  7. MongoDB学习(黑马教程)-1-数据库概述及环境搭建
  8. 华为平板m5鸿蒙,华为平板M5系列发布:搭载麒麟960 售价2088元起
  9. linux single 禁用显卡,告诉你Ubuntu下禁用独显的方法及命令
  10. python语言的基本数据类型_python语言基本数据类型-深浅拷贝