首页 > 编程知识 正文

python编译后运行缺少dll,如何把python编译成exe

时间:2023-05-06 16:31:31 阅读:136335 作者:223

作为Python爱好者,您需要了解. py脚本的基本执行机制和特性。

在许多工作中,Python的运行过程基本上依赖于用户,因此不需要将源代码编译为二进制代码,而是直接从源代码运行程序。 当运行python文件程序时,python解释器将源代码转换为字节码,然后解释器执行这些字节码。

也就是说,有以下三个特性

源代码离基础更远。 别说了,你们也感觉到了。 )

在运行时,必须生成字节码并在虚拟机上运行。 虚拟机在哪里? 让我们看看每个都运行在什么软件上! 没错,是解释器。 请不要说是IDLE哦。 虚拟机具体实现了由switch-case语句构成的框架函数PyEval_EvalFrameEx,刚才说的字节码在该商品上运行。 )

每次运行脚本时,虚拟机总是需要增加加载和链接过程。 (所以,与编译型语言相比有点晚了。 这和“有丝分裂期”一样,准备东西也需要时间。 )

那么,“不是说在运行时总是生成字节码吗! 那么,字节码到哪里去了? ”

诶,别着急! 首先,让我解释一下虚拟机是如何运行脚本的。

完成模块的加载和链接;

将源代码翻译成PyCodeObject对象(此产品为字节码)并写入内存。(它的作用是使CPU易于读取,并加快程序的执行速度。)

命令从存储器空间读取并执行;

程序结束后,根据命令行的调用情况,即程序的执行方式,决定是否将PyCodeObject写回到硬盘。 这意味着直接复制到. pyc或. pyo文件。

然后再次运行此脚本,首先检查本地是否存在上述字节码文件。 实行。 否则,重复上述步骤。

你看! 当我们点击(或输入命令)运行脚本,慢慢地喝咖啡的时候,“人”的虚拟机做了这么多。 但是,是否生成. pyc或. pyo文件取决于程序的运行方式。

同样,“哼! 为什么不直接生成这些文件? 那不是‘更快、更高、更强’! ”

其实,虚拟机也很重视效率。 毕竟,在比较大的项目中,将PyCodeObject写回到硬盘也不可避免地需要时间。 而且,我不知道那个你是不是也只执行了一次,之后,就“扔掉”了刚开始跑的脚本。 但是,那其实也有亲切的一面。

例如,如果直接在命令行中键入python path/to/projectDir,则在程序运行完成后,将自动为当前目录中的所有脚本生成字节码文件,并生成一个新的本地文件详情请参照上述问题板块)

或者,如果在命令行中键入python path/to/project dir/main.py,则会为非__main__.py脚本生成字节码文件。

但总的来说,上述任何行为都大大缩短了项目执行前的准备时间。 (原本分工明确的程序,规模应该不会太小,再利用率也不会太低。 除非你吃饱了撑着,做这么多)

每次导入模块时,它都会始终检查字节码文件的修改时间是否与自身一致。 直接从该字节码文件中读取内容,否则,源模块将重新读取,最后生成一个同名文件并复盖当前现有的字节码,以完成内容更新。 有关详细信息,请参阅import.py。

这样就不会在修改源代码后与本地字节码文件发生冲突(请参见)。

要优化字节码的生成,请注意以下几点:

. pyc文件是编译. py文件生成的字节码文件,加载速度比以前的. py文件快,并且可以隐藏源代码和进行一定程度的反编译。 例如,Python3.4不应尝试运行Python3.3编译并生成的. pyc文件。

. pyo文件也可以通过优化(注意这两个字符,以便于后续理解) (编译后程序) (小于. pyc文件)来加快加载速度。 但是,对于嵌入式系统,可以将所需的模块编译为. pyo文件以减少空间。

但是,总的来说,在作用上和原来的. py脚本几乎没有变化,也就是说是“天然和蛋”。 例如,我个人认为最有用的是避免别人偷看我的代码。 毕竟, py源文件是直接以源代码的形式提供给大家的。

在所有Python选项中:

-O表示优化生成. pyo字节码。 (这里还有“优化”这个词,请注意。 )

-OO意味着从使用-O选项生成的字节码文件中进一步删除文档字符串。 它被有效解释,而不是删除从-O选项获得的文件。

-m,表示要导入并运行指定的模块

相反,按以下格式运行. py文件以生成. pyc文件: 以下调用假设/path/to目录包含. py脚本。

批量处理需要生成python-mpy _ compile/path/to/. pyc的脚本. py#.py文件时

#将替换为需要生成/path/to/{.pyc的脚本1、脚本2、 }.py

#或/path/to/

这和下面的代码有同样的效果。

导入p

y_compile

py_compile.compile(r'/path/to/需要生成.pyc的脚本.py') #同样也可以是包含.py文件的目录路径

#此处尽可能使用raw字符串,从而避免转义的麻烦。比如,这里不加“r”的话,你就得对斜杠进行转义

py_compile是Python的自带模块,这里面就两个函数。其下的py_compile.compile(file[, cfile[, dfile[, doraise]]])可将.py文件编译生成.pyc文件(默认),对应的参数解释如下

file,表示需要生成.pyc或.pyo文件的源脚本名(字符串);

cfile,表示需要生成.pyc或.pyo文件的目标脚本名。呃...好像没有区别(>﹏<) ,也就是源脚本-----[巴拉拉赐予你力量!编译!]( * ̄▽ ̄)o ─═≡※:☆----->目标脚本。当然,它默认是以.pyc为扩展名的路径名的字符串(呼...好长)。此外,当且仅当所使用的解释器允许编译成.pyo文件,才能以“.pyo”结尾。这也就是我上面为什么会在函数功能解释上加上“(默认)”这两个字的原因。

dfile,表示编译出错时,将报错信息中的名字“file”替换为“dfile”。

doraise,设置是否忽略异常。若为True,则抛出PyCompileError异常;否则直接将错误信息写入sys.stderr(什么!不知道sys.stderr?!温馨提示:sys.stderr是Python自带的标准错误输出)

另外,生成.pyo文件的格式调用如下:

python -O -m py_compile /path/to/需要生成.pyo的脚本.py

那么,有人要问了:为什么不是像生成.pyc文件那样采用“python -O /path/to/需要生成.pyo的脚本.py”形式的调用?

“忘记”说明这一点了,很多博客以及书籍都像我上面那样解释“-O”选项的作用,但详细来解释的话是-O选项,将.pyc文件优化(注意我一直强调的“优化”二字,这里就用到啦!)为.pyo文件,而不是将.py文件优化编译为.pyo文件。(其直接的结果是优化编译后的文件略微小于.pyc文件,也就是“减肥”了。现在,大家知道.pyo文件为什么小的原因了吧!)

注意:

以上无论是生成.pyc还是.pyo文件,都将在当前脚本的目录下生成一个含有字节码的文件夹__pycache__。

可能还有人会问,.pyd文件又是什么鬼?

别在意,那只是Python的动态链接库。如果要深究,还得扯上C++的知识。

再啰嗦一句:生成字节码的方法多了去了,不止以上这几种。比如,你们不妨试试将上面命令行调用中的“py_compile”改成“compileall”,而代码行中的“py_compile.compile”改成“compileall.compile_file”或“compileall.compile_dir”,又或者直接使用带有编译功能的IDE生成字节码。

再再啰嗦一句:知道Python运行机制,并不是我们一般人所必须的(吃瓜群众:“滚!我刚好不容易看完了,你才说?!”)。但是,了解其加速程序运行以及优化代码的设计思想,对于我们在日后构造缓存系统、如何减少不必要的运行时间,以及同步更新工作内容等问题上起到很大的借鉴作用。

若想要了解更多的内容,可以去翻翻官方文档和其他博客:

我将优质的技术文章和经验总结都汇集在了我的公众号【Python圈子】里。

在学习Python的道路上肯定会遇见困难,别慌,我这里有一套学习资料,包含40+本电子书,600+个教学视频,涉及Python基础、爬虫、框架、数据分析、机器学习等,不怕你学不会!还有学习交流群,一起学习进步~

文章来源: www.oschina.net,作者:Python圈子,版权归原作者所有,如需转载,请联系作者。

原文链接:https://my.oschina.net/u/4477231/blog/3217516

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。