既然Python是用C实现的,那为什么Python不能直接生成exe呢?

珍懿xbLY4160


C语言其实是一种比较“古老”而且“底层”的语言。其执行效率,仅次于汇编语言。

说其古老,是因为C语言的出现很早。

虽然Fortran、Cobol语言出现比C语言更早,但是现代主流操作系统(Windows、Mac Os、linux、iOS、Android、Unix)全部脱胎于C语言。

说它底层,是因为C语言设计之初就是为了同时编写汇编语言。理论上可以全部用汇编写。而汇编语言是执行效率最高的语言。

所以Python用C语言写一点也不奇怪。这和它能不能生成Exe一点关系都没有。

Exe文件是Windows平台的私有格式。最简单的Exe是Com可执行文件。Exe文件实际上是一个引导程序+一个解释程序组成的。

Python语言生成的代码,只需要配以引导程序和解释程序,就可以作为Exe文件执行。

所以,Python生成Exe文件一点难度都没有。只是它愿不愿意提供的问题。


酱酱理


干嘛非得要生成exe呢?py文件可以直接双击运行,和exe一样的


阳光男孩Y


python不是用C实现的,而是利用了CPython解释器使python的运行效率可以接近C程序。至于为什么不直接生成exe,因为没有必要啊,exe是C程序编译之后执行的,意味着每一次执行python,后端的C解释器都需要将目前的python代码翻译成C代码,再执行编译、检查链接等等一系列操作,之后把所有的库静态或者动态打包好形成一个exe来供用户执行,这个效率未免太低了吧?而且在调用库的时候要如何选择链接方式?使用静态链接的话编译出来的文件会很大,动态链接又不能保证每一个用户都可以执行,不能保证库文件已经正确安装,导致跨平台性不好。

Python运行原理是运行在C编写的Python虚拟机上,通过opcode来决定python需要执行的指令,并且可以通过创建线程的方式来提高python的运行效率。只要解释器生成了对应的机器码,虚拟机线程可以立刻进入执行状态,效率比编译高多了,无论是暂停、修改还是重新运行速度都非常快。


榻榻米的榻榻


可以生成的。但是但是py生成exe绝对是你的噩梦。先不说过程的麻烦。单单说生成出来的文件大小都得50m以上!所以现实当中基本没人这么干的。


matrix83


任何语言在理论上都是可以生成可执行文件的(exe文件是windows环境下的一种可执行文件),但是实际上由于python在设计之时将其设计成为一个脚本语言,其并没有相关编译成可执行文件的编译器,但有一种方法是进行打包,就是引入PyWin32包后,使用下面的pyinstaller 命令进行打包生成一个exe。

命令格式如下,为方便显示做了分行处理:

pyinstaller [主文件] -p [其他文件1] -p [其他文件2]

--hidden-import [自建模块1]

--hidden-import [自建模块2]


下来,我们说明一个概念。什么是可执行文件?

PE(Portable Executable)格式,是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。PE格式文件分为PE32和PE64,PE32是win32也就是windows 32位操作系统原生态的可执行文件,其借助于wow64子系统,可以运行于64位windows环境下。PE64是windows64位操作系统下的可执行文件格式。

在宇宙第一IDE VS环境下,可通过工程配置管理器来选择生成的exe是32位的还是64位的。

PE文件格式如下图所示:


我们通过PE文件的格式图可以看出,PE文件更像一个数据的组织架构图,其按照严格的数据组装方式进行数据分配管理索引(当然这些是由编译器和链接器最终生成的),而且其代码最终编译成与CPU相关的机器码,其依赖的库是系统相应的dll动态库或其它资源。


PYTHON语言一个脚本语言,其运行是通过python解释器负责执行的。其代码在运行过程中通过python解释器将python语言进行翻译成机器码,然后再交由CPU去执行。

当然PYTHON也是可以编译的,不过这里的编译只是将脚本代码翻译成python对应的字节流,其并不是真正的机器码。

所以我们可以进行这样的一个对比说明:

C语言经过编译链接,最终生成了与机器机关的汇编执令,其编译后文件数据的组织方式为PE格式,其在运行时由进程加载器负责其依赖的系统库的加载和初始化。而python无论是否编译,最终是将其python的代码或者字节流交由python解释器去解释执行,其与系统无关,但python解释器是与系统有关,而且python代码在使用过程中需要的库资源由python虚拟机负责加载初始化,并给python提供接口。


而现在python打包生成的exe只是对python脚本、python的解释器、python脚本需要引入的包和 python虚拟机进行一个打包,并非一个真正意义上的exe文件,其在运行过程中本质是由python解释器负责解释python代码并在其虚拟中执行的。


子欲成德


理解错误。

Python是解析性脚本语言,他的执行过程就是解析的过程,所以本身不需要弄成可执行文件,和PHP一毛一样。

而C,C++是编译性语言,所以他们需要编译器,编译后的结果,就需要变成可执行文件。

但,并不是不能做成可执行文件,需要对应的工程开发环境,如,Windows下,用Python开发桌面应用,就能打包成exe可执行文件。


刘氓兔


在windows上,通过pyinstaller模块可以直接打包python程序成exe文件


欣情July


pyinstaller 可以构建exe包


熊猫熏香


那是脚本,既命令的组合,解释型语言,C是编译型语言,你想编译直接用C,何必绕弯子


tree5433


这个当然没有问题,Python程序可以被编译成Windows可执行文件。


分享到:


相關文章: