精华内容
下载资源
问答
  • 通常的说法,编译代表着将一个高级语言转化为 CPU 执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。与此相对的,解释的意思是这...

    5d1dc72c6bb4a239.jpg

    一个经常听见的问题,那就是:Python是解释型的语言吗?它会被编译吗?这个问题没有想象中那么好回答。和很多人认识世界一样,习惯以一个简单的模型去评判一些事物。而事实上,里面包含了很多很多的细节。

    通常的说法,编译代表着将一个高级语言转化为 CPU 能执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。

    与此相对的,解释的意思是这样的:程序运行时每次读源文件中的一行代码,并执行相应的操作,就这样一行一行的重复下去。当然,所谓的脚本语言就是这么运行的。

    但事实上,上面的定义有太多的局限。一门真正的语言,为了拥有更多有用和强大的特性,通常采用了各种各样的实现方式。我们可以将编译理解为更通用一些:将一种语言转化为另一种语言形式。通常来说,源语言比目标语言要更高级一些,比如将 C 转化为机器码。当然,JavaScript 8 到 JavaScript 5 的转化也算是一种编译。

    1562232237113090.jpg

    在Python中,源代码会被编译为更低级的一种形式,我们称之为字节码。字节码是一串指令,和 CPU 的指令集类似。但是字节码并不直接被 CPU 执行,而是在虚拟机中执行的。当然,这里的虚拟机并不模仿整个操作系统的环境,只是提供了字节码执行的一个环境。

    下面我们看 Python 的一小段代码以及它对应的字节码

    1562232268598755.jpg

    看了字节码的内容后,我们就知道 f'...' 这种格式化字符串的形式的运行原理,就是将里面的字符串转化为一系列的字面字符串与变量,然后使用 + 号连接起来。

    dis 是 Python 标准库中反汇编模块,它可以展示 Python 代码的字节码信息。上面提到的执行字节码的虚拟机,可以用任意的语言实现,包括 Python 自己。有兴趣的可以去 GitHub 上看下这个项目 nedbat/byterun 。这个项目可以用来学习,但不适用于生产环境。

    不过,我们运行 Python 时完全感受不到它的编译过程,没有显示的调用什么编译程序,仅仅是简单的执行 .py 文件,编译都是需要时自动编译的。这和 JAVA 不同,当你每次写完 JAVA 代码要执行时,都要手动将其编译为 .class 文件,然后执行。也正是这个原因,JAVA 被称为编译型语言,而 Python 被叫做解释型语言。但事实上,两种语言执行时都会先编译成字节码,然后交给虚拟机执行。

    Python还有一个重要的特性,就是交互式命令行。你可以敲入一行 Python 语句,然后立刻回车执行。实际上,即使是这个过程,Python 同样是先转为字节码,然后执行。而这个交互式命令行这个特性,在很多编译型语言里是没有的。同样因为没有显示的调用编译程序,很多人将执行Python源文件的程序叫做Python解释器。

    即使比较简略,但还是补充下。部分编译型语言比如 C 或者 JAVA 也有交互式命令行,但这些并不是这些语言的重心。JAVA 刚开始是编译成字节码然后执行,后面有了即时编译技术( JIT )可以直接编译成机器码,与 C 类似。

    从上面的描述可以看出,不管是解释还是编译,并没法完全分离开来。很多时候,我们想用一些词将现有的编程语言分个类,但事实上要办到这一点太难了。

    最后要说明的是,你的代码是怎么执行的只是语言的实现问题,并非语言的特征。上文中,我们讨论的是 Python ,但实际上是 CPython 的描述。CPython 是一个解释器,之所以这么叫,是因为这个解释器是用 C 编写的,这也是 Python 默认的解释器。当然还有其它很多解释器,比如,PyPy 就是另一种解释器,使用了 JIT 技术,运行速度相比 CPython 有较大提升。

    回到标题中的问题,Python之所以称为解释型语言,是因为它没有显示的调用编译操作,表现出解释型的特性比较多而已。但事实上,编译是存在的,具体怎么编译就看语言的实现了,也就是解释器的设计。

    更多Python相关技术文章,请访问Python教程栏目进行学习!

    以上就是python需要编译么的详细内容,更多请关注php中文网其它相关文章!

    本文原创发布php中文网,转载请注明出处,感谢您的尊重!

    展开全文
  • 目录 ... pyc文件是二进制文件,可以保护源代码不被看见,当然也有大牛编译,这个还么有研究过 使用 将该函数py文件放在和待编译的工程目录同一级,运行就可以了 import datetime from pathlib.

    目录

     

    功能

    pyc部署优点

    使用


    功能

    将Python工程目录下的所有py文件(递归所有子目录)编译成pyc文件,可选择生成新的工程目录,也可以选择删除源文件,仅保留pyc文件用于部署

    pyc部署优点

    • 省去了Python动态编译的过程,直接加载pyc字节码文件,可以加速Python运行速度
    • pyc文件是二进制文件,可以保护源代码不被看见,当然也有大牛能反编译,这个还么有研究过

    使用

    将该函数py文件放在和待编译的工程目录同一级,运行就可以了

    import datetime
    from pathlib import Path
    import os
    import shutil
    import compileall
    
    def package(root_path="./test_project/",reserve_one=False):
        """
        编译根目录下的包括子目录里的所有py文件成pyc文件到新的文件夹下
        如果只保留一份文件,请将需编译的目录备份,因为本程序会清空该源文件夹
        :param root_path: 需编译的目录
        :param reserve_one: 是否只保留一个目录
        :return:
        """
        root = Path(root_path)
    
        # 先删除根目录下的pyc文件和__pycache__文件夹
        for src_file in root.rglob("*.pyc"):
            os.remove(src_file)
        for src_file in root.rglob("__pycache__"):
            os.rmdir(src_file)
    
        current_day = datetime.date.today()  # 当前日期
        edition = "1.0"  # 设置版本号
    
        dest = Path(root.parent / f"{root.name}_{edition}.{'001'}_beta_{current_day}")  # 目标文件夹名称
    
        if os.path.exists(dest):
            shutil.rmtree(dest)
    
        shutil.copytree(root, dest)
    
        compileall.compile_dir(root, force=True)  # 将项目下的py都编译成pyc文件
    
        for src_file in root.glob("**/*.pyc"):  # 遍历所有pyc文件
            relative_path = src_file.relative_to(root)  # pyc文件对应模块文件夹名称
            dest_folder = dest / str(relative_path.parent.parent)  # 在目标文件夹下创建同名模块文件夹
            os.makedirs(dest_folder, exist_ok=True)
            dest_file = dest_folder / (src_file.stem.rsplit(".", 1)[0] + src_file.suffix)  # 创建同名文件
            print(f"install {relative_path}")
            shutil.copyfile(src_file, dest_file)  # 将pyc文件复制到同名文件
    
        # 清除源py文件
        for src_file in dest.rglob("*.py"):
            os.remove(src_file)
    
        # 清除源目录文件
        if reserve_one:
            if os.path.exists(root):
                shutil.rmtree(root)
            dest.rename(root)
    
    
    if __name__ == '__main__':
        package(root_path="./test_project/",reserve_one=False)
    
        # 会清空源文件夹,记得备份,适合上线部署,删除源代码,防止泄露
        # package(root_path="./test_project/",reserve_one=True)

     

    展开全文
  • Python】-007 删除VS编译后生成的临时文件   作为一个曾经主攻word的伪C++工程师,每次使用VS编译C++工程之后发现总会生成一堆各种各样的临时文件,虽然眼不见为净,但每次收到别人给我发的带有一堆临时文件的...

    【Python】-007 删除VS编译后生成的临时文件

      作为一个曾经主攻word的伪C++工程师,每次使用VS编译C++工程之后发现总会生成一堆各种各样的临时文件,虽然眼不见为净,但每次收到别人给我发的带有一堆临时文件的项目源代码的时候,内心总会有一万只神兽呼啸而过。给代码之前就不会清理一下么。。。

      虽然windows的批处理也能很好的按照特定的后缀名删除文件,但批处理我实在是不熟悉,所以只能用python来干这活了。

    1 编写Python脚本递归的删除目录下的特定类型文件

    '''
    递归的删除目录下特定后缀名的文件,如果删除文件后文件夹为空,删除该文件夹
    '''
    
    import os
    import sys
    
    dir=[]
    if(len(sys.argv) == 1):
        print("You dont input the folder path that you want to list file name, dir will be default to ./!\n")
        dir="./"
    else:
        dir=sys.argv[1]
    
    # 指定VS临时文件
    tobecleanedfileexts=[".idb",".db",".ipdb",".pdb",".iobj",".ilk",".exp",".obj",".log",".tlog",".lastbuildstate",".opendb",".ipch",".pch","unsuccessfulbuild"]
    
    dir = dir.replace("\\\\",'/')
    dir = dir.replace("\\",'/')
    path = dir #文件夹目录
    datas = []
    
    def CleanPath(filepath):
        fileNames = os.listdir(filepath)  # 获取当前路径下的文件名,返回List
        for file in fileNames:
            newDir = filepath + '/' + file # 将文件命加入到当前文件路径后面
            if os.path.isfile(newDir):  # 如果是文件
                fileext = os.path.splitext(file)[-1]
                if fileext in tobecleanedfileexts :
                    newDir = newDir.replace("\\\\", '/')
                    newDir = newDir.replace("\\", '/')
                    try:
                        os.remove(newDir)
                        print("remove "+newDir)
                    except PermissionError as identifier:
                        pass
    
            else:
                CleanPath(newDir)                #如果不是文件,递归这个文件夹的路径
                try:
                    if not os.listdir(newDir):
                        os.removedirs(newDir)
                        print("removedir "+newDir)
                except FileNotFoundError as identifier:
                    pass
    
    if __name__ == "__main__":
        CleanPath(path)
    

    2 让VS编译之后自动执行脚本

      脚本写完了,在Python里试了一下,确实能够删除特定类型的文件了。但每次编译完之后都需要手动去命令行里执行一下,有点费事。作为一个“懒惰促进社会进步”观念的信徒,这活必须让VS帮我干了。

      所以,打开VS,项目属性->生成事件->后期生成事件,在命令行里输入“python CleanVSTempFiles.py脚本路径 需要清理的路径”,这样每次生成完成之后,VS会自动执行这个脚本去清理特定的路径了。

      清理工作是做完了,但在debug模式下需要调试的时候发现刚才清理的时候把所有调试的临时文件也删除了。于是将刚才的命令行只设置到release模式下。恩,挺好了。每次release模式编译完之后进行清理。

    展开全文
  • 通常的说法,编译代表着将一个高级语言转化为 CPU 执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。 与此相对的,解释的意思是这样...
  • 通常的说法,编译代表着将一个高级语言转化为 CPU 执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。与此相对的,解释的意思是这样的...

    通常的说法,编译代表着将一个高级语言转化为 CPU 能执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。

    与此相对的,解释的意思是这样的:程序运行时每次读源文件中的一行代码,并执行相应的操作,就这样一行一行的重复下去。当然,所谓的脚本语言就是这么运行的。

    在 Python 中,源代码会被编译为更低级的一种形式,我们称之为字节码。字节码是一串指令,和 CPU 的指令集类似。但是字节码并不直接被 CPU 执行,而是在虚拟机中执行的。当然,这里的虚拟机并不模仿整个操作系统的环境,只是提供了字节码执行的一个环境。

    Python 还有一个重要的特性,就是交互式命令行。你可以敲入一行 Python 语句,然后立刻回车执行。实际上,即使是这个过程,Python 同样是先转为字节码,然后执行。而这个交互式命令行这个特性,在很多编译型语言里是没有的。同样因为没有显示的调用编译程序,很多人将执行 Python源文件的程序叫做 Python 解释器。

    解释型语言和编译型语言

    计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。

    编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。

    解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。

    通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上接近编译型语言,而不能超过编译型语言。

    此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。

    用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

    内容扩展:

    一个经常听见的问题,那就是:Python 是解释型的语言吗?它会被编译吗?这个问题没有想象中那么好回答。和很多人认识世界一样,习惯以一个简单的模型去评判一些事物。而事实上,里面包含了很多很多的细节。

    通常的说法,编译代表着将一个高级语言转化为 CPU 能执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。

    与此相对的,解释的意思是这样的:程序运行时每次读源文件中的一行代码,并执行相应的操作,就这样一行一行的重复下去。当然,所谓的脚本语言就是这么运行的。

    但事实上,上面的定义有太多的局限。一门真正的语言,为了拥有更多有用和强大的特性,通常采用了各种各样的实现方式。我们可以将编译理解为更通用一些:将一种语言转化为另一种语言形式。通常来说,源语言比目标语言要更高级一些,比如将 C 转化为机器码。当然,JavaScript 8 到 JavaScript 5 的转化也算是一种编译。

    到此这篇关于python属于解释型语言么的文章就介绍到这了,更多相关python是解释型语言吗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • 通常的说法,编译代表着将一个高级语言转化为 CPU 执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。与此相对的,解释的意思是这样的...
  • 通常的说法,编译代表着将一个高级语言转化为 CPU 执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。与此相对的,解释的意思是这样的...
  • 通常的说法,编译代表着将一个高级语言转化为 CPU 执行的机器码。当你编译 C 的时候,的确是做的这样的操作。编译的结果是一个二进制可执行文件,这时你的系统可直接运行这个程序。与此相对的,解释的意思是这样的...
  • java属于高大上,适合12306这种有钱的金主,同样的项目要是用java做的,就唬来成倍的钱,没钱搞java,只能晚上加班到10来点,在eclipse吭哧吭哧地编译完项目以后,在七八屏的堆栈信息里,不停上翻下翻象捡...
  • <div><p>你好, 在deploy/python路径下有如下...请问麻烦更新一下关于deploy/python 使用tensorrt推理的全流程教程么,谢谢</p><p>该提问来源于开源项目:PaddlePaddle/PaddleDetection</p></div>
  • scrapy-安装问题

    2018-03-11 00:30:19
    那怎么装啊,我来总结一下三方库有哪些安装方式源码安装pip setup.py install安装有setuotool工具的话,这个就用,setup.py文件就是python三方包的那个东西和 C的makefile玩意一样,这个包如果带有c文件或者库的话...
  • 直接编译,安装,是不再次进行配置的。因为以配置config文件就会再次生成,那么宏开关就又开了。 OK,安装好了,下来继续进行编译mediastreamer2.。。。。。。。。。。。 。。。。。。。。。。。。。。 又出现了...
  • fex-team.github.io.zip

    2019-07-19 09:06:32
    如果在 Mac 下安装遇到编译报错,可以试试用 Brew 安装新版 ruby brew install ruby Windows 下 jekyll 官方对 winodws 的支持程度很低,推荐使用 Building portable Jekyll for Windows,另外这里附上网盘地址...
  • 字符串不改,那转成数组改吗,怎么改 怎么判断一个数组是否已经排序 普通map如何不用锁解决协程安全问题 array和slice的区别 golang面试题:json包变量不加tag会怎么样? 零切片、空切片、nil切片是什么 slice深...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

python能编译文件么

python 订阅